2014-01-09 4 views
1

Я недавно взял на себя поддержку проекта ASP.NET MVC и пытаюсь работать с некоторыми из ошибок, в частности, я был в тупике, хотя ,ASP.NET MVC - ссылка на объект не установлена ​​в экземпляр объекта

У нас есть страница «новая», чтобы добавить новые элементы, с помощью следующего кода, работающих при отправке страницы:

[HttpPost] 
public ActionResult New(RecordView i) 
{ 
    if(ModelState.IsValid) 
    { 
     repository.AddRecord(i.DogIncident); 

     return View("Index"); 
    } 
    return View("Index"); 
} 

Однако, когда он пытается загрузить представление индекса, я получаю следующее сообщение об ошибке : "Ссылка на объект не установлена ​​в экземпляр объекта." и он указывает на следующий блок кода в верхней части файла с именем RecordsView.cshtml:

@for (var i = 0; i < Model.Records.Count; i++) 

Пластинка действительно добавляет правильно, хотя, он просто не загружает страницу прейскурантов правильно, и так как это просто «приятно иметь». Я думал, что упростил бы все, изменив его так, чтобы он либо возвращал некоторый текст, который генерирует ошибку, так как ожидает ожидание логического значения.

Любые идеи о том, как исправить это, пожалуйста? Я в тупике.

Спасибо!

+1

Вы пытаетесь получить доступ к модели в своем представлении, но вы не проходите мимо. –

+2

Вы не передаете модель при вызове return View («Индекс»); вам нужно что-то вроде возврата View («Index», someModel); –

+0

Благодарим вас, пожалуйста, извините мое невежество, но я импортирую свои модели с помощью инструкции «using» в верхней части страницы, и я хочу включить один из них под названием «Foo», например, View («Index», Foo)? просто он вызывает ошибку для меня – Nick

ответ

3

поток кода здесь не выглядит прямо:

[HttpPost] 
public ActionResult New(RecordView i) 
{ 
    if(ModelState.IsValid) 
    { 
     repository.AddRecord(i.DogIncident); 

     return View("Index"); 
    } 
    return View("Index"); 
} 

Из вашего описания выше, это звучит так, как будто Вы отправляете с вашей New зрения, к этому New действию, которые должны затем перенаправлять, в случае успеха, ваши Index действия. В настоящее время вышеуказанный код этого не делает, и он также не может повторно отобразить форму, если модель недействительна. Это должно выглядеть примерно так:

[HttpPost] 
public ActionResult New(RecordView i) 
{ 
    if(ModelState.IsValid) 
    { 
     repository.AddRecord(i.DogIncident); 

     return RedirectToAction("Index"); 
    } 

    // Redisplay the `New` view, passing the model 
    // back to it in order to repopulate the form 
    return View(i); 
} 

Важное различие между return View(...) и return RedirectToAction(...), что последний будет работать действие и возвращают соответствующий вид. Первые просто вернут представление. Это имеет последствия в том, что если действие Index создает модель и передает ее в вид Index, ничего из этого не произойдет, если вы просто вернете представление.

Можно, конечно, сделать что-то вроде:

return View("Index", new YourModelType()); 

, но это не будет работать, если, как уже говорилось выше, ваша Index действие выполняет некоторую другую конструкцию данных для вашей модели, такие как падение потенциала вниз списки, которые new YourModelType() не сделали.

Также, если данные, отправленные в действие POST, действительны, вы должны перенаправить на другое действие (как я уже делал выше), а не просто возвращать представление, чтобы соответствовать шаблону Post-Redirect-Get, который предотвращает некоторые типы дублированных форм.

+0

в моем случае отличие 'return View (...) 'и' return RedirectToAction (...) 'была проблема. Я использовал 'return View()', который не вызывал метод действия в моем контроллере – VSB

1

Отображается индексный указатель и кажется, что для него требуется модель Model - Model.Records. И вы не передаете его в этом действии HttpPost.

Если у вас есть действие для этого индекса страницы, то вы можете просто сделать

[HttpPost] 
public ActionResult New(RecordView i) 
{ 
    if(ModelState.IsValid) 
    { 
     repository.AddRecord(i.DogIncident); 

     return RedirectToAction("Index"); 
    } 
    return View(i); 
} 

Это будет просто перенаправить пользователя на Индексный, после создания нового RecordView пункта

1

If Records список , убедитесь, что ваш ViewModel имеет конструктор:

public class RecordView 
{ 
    public List<Record> Records { get; set; } 

    public RecordView() 
    { 
     Records = new List<Record>(); 
    } 
} 
+0

Я думаю, что это не сработает, так как страница индекса должна иметь некоторую модель. и ваш ответ просто удалит NRE, но на этой странице не будут отображаться какие-либо данные. –

+0

Спасибо, это передаёт информацию, которую я думаю, потому что если вы перейдете в/Home/it, загрузите все нормально, только когда она маршрутизируется из/Home/New /, что она генерирует ошибку – Nick

1

В основном вы, возможно, пытаетесь достичь PRG(Post/Redirect/Get).

Я думаю, проблема в том, что вы не отправляете модель для вашего запроса GET.

Post -> Сохранить -> Перенаправление -> Load Data ->Присвоить Посмотреть Список -> Доступ в представлении

// POST & REDIRECT

[HttpPost] 
public ActionResult New(RecordView i) 
{ 
    if(ModelState.IsValid) 
    { 
     repository.AddRecord(i.DogIncident); 

     return RedirectToAction("Index"); 
    } 
} 

// GET

public ActionResult Index() 
{ 
var model=new MyViewModel(); 

model.Records=repository.GetRecords(i.DogIncident); 

return View(model); //Assign to View in Index 
} 

Index.cshtml

@model MyViewModel 

@for (var i = 0; i < Model.Records.Count; i++) 
1

Вы упомянули, что запись добавляет правильно, так что вы должны передавать действительную модель записи в ваш взгляд с другим действия, чем в комплекте поставки.

Если @for (var i = 0; i < Model.Records.Count; i++) является причиной этой ошибки, я предполагаю, что модель существует, но свойство Records не было установлено. Одной из ближайших работ будет проверка наличия этого свойства до его доступа. Например:

if (Model.Records != null) { 
    for (var i = 0; i < Model.Records.Count; i++) ..... 
} 
0

Я думаю, что у вас есть коллекции, не создаваемые экземпляром, ошибка может быть в моделях, не представленных на моделях. это потому, что когда когда-либо у вас есть коллекция, вам нужно создать экземпляр внутри конструктора этого объекта.

Смежные вопросы