У меня проблема с проверкой на стороне клиента в представлении, которое отображает раскрывающийся список с помощью Html.RenderAction.
У меня есть два контроллера. SpecieController и CatchController, и я создал ViewModels для моих представлений.
Я хочу сохранить его как можно более сухим, и, скорее всего, мне понадобится DropDownList для всех Specie в других местах в ближайшем будущем.
Когда я создаю Catch, мне нужно установить отношение к одному виду, я делаю это с идентификатором, который я получаю из DropDownList of Species.
ViewModels.Catch.Create
[Required]
public int Length { get; set; }
[Required]
public int Weight { get; set; }
[Required]
[Range(1, int.MaxValue)]
public int SpecieId { get; set; }
ViewModels.Specie.DropDownList
public DropDownList(IEnumerable<SelectListItem> species) { this.Species = species; }
public IEnumerable<SelectListItem> Species { get; private set; }
Мое представление для действия Catch.Create использует ViewModels.Catch.Create в качестве модели.
Но мне кажется, что я что-то упустил в реализации. В моей голове я хочу соединить выбранное значение в DropDownList, которое приходит из RenderAction, с моим SpecieId.
View.Catch.Create
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<BC.ProjectName.Web.ViewModels.CatchModels.Create>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<div class="row">
<div class="editor-label">
<%: Html.LabelFor(model => model.Weight) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Weight) %>
<%: Html.ValidationMessageFor(model => model.Weight) %>
</div>
</div>
<div class="row">
<div class="editor-label">
<%: Html.LabelFor(model => model.Length) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Length) %>
<%: Html.ValidationMessageFor(model => model.Length) %>
</div>
</div>
<div class="row">
<div class="editor-label">
<%: Html.LabelFor(model => model.SpecieId) %>
</div>
<div class="editor-field">
<%-- Before DRY refactoring, works like I want but not DRY
<%: Html.DropDownListFor(model => model.SpecieId, Model.Species) %>
--%>
<% Html.RenderAction("DropDownList", "Specie"); %>
<%: Html.ValidationMessageFor(model => model.SpecieId) %>
</div>
</div>
<div class="clear"></div>
<input type="submit" value="Save" />
</fieldset>
<% } %>
</asp:Content>
CatchController.Create
[HttpPost]
public ActionResult Create(ViewModels.CatchModels.Create myCatch)
{
if (ModelState.IsValid)
{
// Can we make this StronglyTyped?
int specieId = int.Parse(Request["Species"]);
// Save to db
Catch newCatch = new Catch();
newCatch.Length = myCatch.Length;
newCatch.Weight = myCatch.Weight;
newCatch.Specie = SpecieService.GetById(specieId);
newCatch.User = UserService.GetUserByUsername(User.Identity.Name);
CatchService.Save(newCatch);
// After save redirect
return Redirect("/");
}
// Invalid
return View();
}
Этот сценарий работает, но не так гладко, как я хочу.
- Проверка ClientSide не работает для SpecieId (после рефакторинга), я понимаю, почему, но не знаю, как я могу это исправить.
- Могу ли я "склеить" DropDownList SelectedValue в myCatch, чтобы мне не нужно было получать значение из Request ["Species"]
Заранее спасибо, что нашли время для этого.