Я надеюсь, что кто-то может помочь с этим. У меня есть три класса модели, как это:
public class Provider
{
public Guid ProviderId { get; set; }
public string Name { get; set; }
public Guid LocationId { get; set; }
public virtual Location Location { get; set; }
}
public class Location
{
public Guid LocationId { get; set; }
public string NameOrCode { get; set; }
public string Description { get; set; }
public string StreetNumber { get; set; }
public string StreetAddress1 { get; set; }
public string StreetAddress2 { get; set; }
public string City { get; set; }
public int? StateId { get; set; }
public string Zip { get; set; }
public string ContactPhone { get; set; }
public virtual State State { get; set; }
}
public class State
{
public int StateId { get; set; }
public string Name { get; set; }
public string Abbreviation { get; set; }
}
Как видите, у Провайдера есть Местоположение (отдельный класс для повторного использования в другом месте), а у Местоположения есть Состояние (которое равно нулю, пока не выбрано).
Мой контроллер выглядит следующим образом для моих методов создания:
public class ProviderController : BaseController
{
private SetupContext db = new SetupContext();
// other CRUD methods ...
//
// GET: /Provider/Create
public ActionResult Create()
{
Location location = new Location()
{
LocationId = Guid.NewGuid(),
NameOrCode = Resources.BillingLocation,
Description = Resources.BillingLocationDescription
};
Provider provider = new Provider()
{
ProviderId = Guid.NewGuid(),
LocationId = location.LocationId,
Location = location
};
ViewBag.StateId = new SelectList(db.States, "StateId", "Name", provider.Location.StateId);
return View(provider);
}
//
// POST: /Provider/Create
[HttpPost]
public ActionResult Create(Provider provider)
{
if (ModelState.IsValid)
{
db.Locations.Add(provider.Location);
db.Providers.Add(provider);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.StateId = new SelectList(db.States, "StateId", "Name", provider.Location.StateId);
return View(provider);
}
// other CRUD methods ...
}
Наконец, мой вид выглядит так:
<div class="editor-label">
@Html.LabelFor(model => model.Location.StateId, @Resources.Location_State_Display_Name)
</div>
<div class="editor-field">
@Html.DropDownList("StateId", @Resources.ChooseFromSelectPrompt)
@Html.ValidationMessageFor(model => model.Location.StateId)
</div>
Моя проблема в том, что состояние, которое пользователь выбирает в DropDownList, никогда не устанавливается в моей модели при создании POST. У меня есть похожий код в моем представлении редактирования, и состояние в этом представлении корректно заполняется (то есть состояние, связанное с существующим Provider.Location показывает, выбранное в DropDownList для пользователя, чтобы редактировать его по желанию), но как в Create, так и в Виды редактирования, выбранные пользователем, никогда не регистрируются в моей модели (в частности, Provider.Location.StateId), поступающей из POST.
Глядя на созданный HTML, я вижу это:
<div class="editor-label">
<label for="Location_StateId">State/Territory</label>
</div>
<div class="editor-field">
<select id="StateId" name="StateId"><option value="">[Choose]</option>
<option value="1">Alabama</option>
<option value="2">Alaska</option>
<!-- more options ... -->
</select>
<span class="field-validation-valid" data-valmsg-for="Location.StateId" data-valmsg-replace="true"></span>
</div>
Я подозреваю, что мне нужно каким-то образом передать отношение Location.StateId, а не просто StateId, как я вижу выше, но я не могу понять правильный синтаксис для этого. Я попытался изменить динамическое свойство ViewBag на Location_StateId, например:
ViewBag.Location_StateId = new SelectList(db.States, "StateId", "Name", provider.Location.StateId);
И DropDownList в моем представлении выглядит так:
@Html.DropDownList("Location_StateId", @Resources.ChooseFromSelectPrompt)
Тогда я подумал, что, возможно, нотация сработает, потому что метка рядом с моим DropDownList отображалась как:
<div class="editor-label">
<label for="Location_StateId">State/Territory</label>
</div>
Эта попытка не сработала. Вы можете мне помочь?
Заранее спасибо.