Я даже не уверен, с чего начать объяснять эту проблему. Я работаю над этим примерно за последние 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
.Сломанный материал - пустая строка
Есть ли что-то, что мне не хватает? Кто-нибудь сталкивался с чем-то подобным раньше?