2010-09-14 5 views
0

Я даже не уверен, с чего начать объяснять эту проблему. Я работаю над этим примерно за последние 10 часов, не имея понятия о том, что является основной причиной. Если какие-либо дополнительные данные необходимы, я был бы рад предоставить. Я просто догадываюсь, что актуально на данный момент.Asp.net MVC2 ModelBindingContext.ModelName empty

У меня есть сайт MVC2 с маршрутами, установленными замечательным пакетом RestfulRouting Стивом Ходжкисом, используя настройку маршрута по умолчанию с вложенными контроллерами (например,/customer/{custid}/location/{locid} и т. Д.).

В этом случае у меня есть одна конкретная модель, которая дает мне проблемы. По какой-то причине, когда сообщение create page post возвращает данные на мой сервер, свойство ModelName в объекте ModelBindingContext передается в DefaultModelBinder (ну, мой пользовательский класс, унаследованный от DefaultModelBinder, обрабатывает захват объектов из репозитория). Это происходит только для этой модели. И я не вижу различий вообще.

Разбитой модель

public class RemedialItem : Entity 
{ 
    public virtual int Id { get; set; } 
.... 

рабочая модель:

public class Customer : Entity 
{ 
    public virtual int Id { get; set; } 
.... 

Entity просто пустой класс, используемый в качестве маркеров для использования Reflection.

Разбитый метод контроллера в RemedialItemController.cs

[HttpGet] 
public ActionResult New(int? locationId, int? applianceId) 
{ 
    var model = ViewModelFactory.Create<CreateRemedialItemViewModel>(); 
    model.Categories = (from c in repository.Query<RemedialItemCategory>() 
         orderby c.Name 
         select c).ToList(); 
    model.RemedialItem = new RemedialItem(); 
    return View(model); 
} 

рабочий метод контроллера в CustomerController.cs

[HttpGet] 
    public ActionResult New() 
    { 
    var viewModel = ViewModelFactory.Create<SingleCustomerViewModel>(); 
    viewModel.Customer = new Customer(); 

    return View(viewModel); 
    } 

ViewModelFactory является впрыскивается класс, который обрабатывает настройки некоторые основные свойства, общие для всех моделей зрения (в основном это пользователь вошел в систему и пользовательские данные прямо сейчас)

Нарушенная модель:

public class CreateRemedialItemViewModel : ViewModelBase 
{ 
    public RemedialItem RemedialItem { get; set; } 
    public IList<Location> Locations { get; set; } 
    public IList<Appliance> Appliances { get; set; } 
    public IList<RemedialItemCategory> Categories { get; set; } 
} 

с рабочим ViewModel:

public class SingleCustomerViewModel : ViewModelBase 
{ 
    public Customer Customer { get; set; } 
} 

ViewModelBase содержит несколько свойств, заселенных ViewModelFactory.

Разбитый форма таял Новый взгляд на RemedialItem:

<% using(Html.BeginForm("Create","RemedialItem",FormMethod.Post)) 
{%> 
<%: Html.AntiForgeryToken() %> 
<fieldset>  
    <legend>General</legend>  
    <div> 
     <%: Html.LabelFor(m=>m.RemedialItem.Category) %> 
     <%:Html.DropDownListFor(m=>m.RemedialItem.Category.Id, new SelectList(Model.Categories,"Id","Name")) %> 
    </div> 
    <div> 
     <%: Html.LabelFor(m=>m.RemedialItem.Item) %> 
     <%: Html.TextAreaFor(m=>m.RemedialItem.Item) %> 
    </div> 
    <div> 
     <%: Html.LabelFor(m=>m.RemedialItem.Note) %> 
     <%: Html.TextAreaFor(m=>m.RemedialItem.Note) %> 
    </div> 
    <input type="submit" value="Create Item" /> 
</fieldset> 
<%}%> 

Работающий Новый вид:

<% using (Html.BeginForm("Create","Customer",FormMethod.Post)) {%> 
    <%: Html.ValidationSummary(true) %> 
    <%:Html.AntiForgeryToken() %> 
    <fieldset> 
     <legend>Fields</legend> 
     <p> 
     <%: Html.LabelFor(m=>m.Customer.Name) %> 
     <%: Html.TextBoxFor(m=>m.Customer.Name) %> 
     </p> 
     <p> 
     <%: Html.LabelFor(m=>m.Customer.Street) %> 
     <%: Html.TextBoxFor(m=>m.Customer.Street) %> 
     </p> 
     [...tl;dr...] 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

Оба производят подобные имена полей:

Сломанный:

<label for="RemedialItem_Item">Item</label> 
<textarea cols="20" id="RemedialItem_Item" name="RemedialItem.Item" rows="2"> 
</textarea> 

Работы нг:

<label for="Customer_Name">Name</label> 
<input id="Customer_Name" name="Customer.Name" type="text" value="" /> 

Я извиняюсь за слишком длинный код свалки, короче: Рабочего набора вещей, когда отправил обратно на создание формы, имеет ModelName установлен Customer.Сломанный материал - пустая строка

Есть ли что-то, что мне не хватает? Кто-нибудь сталкивался с чем-то подобным раньше?

ответ

0

Я нашел проблему. В ViewModel свойство, содержащее экземпляр RemedialItem для отображения, было вызвано RemedialItem. В действии, которое он отправил, параметр, который принял экземпляр RemedialItem, был вызван item, и это сломало все.

Короче говоря, при использовании ViewModels убедитесь, что имя параметра, которое принимает объект из ViewModel, совпадает с именем свойства в модели viewmodel.

Прошел мой день.