Проверка клиента MVC2 с аннотациями в представлении с помощью RenderAction - PullRequest
0 голосов
/ 01 июня 2010

У меня проблема с проверкой на стороне клиента в представлении, которое отображает раскрывающийся список с помощью 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();
}

Этот сценарий работает, но не так гладко, как я хочу.

  1. Проверка ClientSide не работает для SpecieId (после рефакторинга), я понимаю, почему, но не знаю, как я могу это исправить.
  2. Могу ли я "склеить" DropDownList SelectedValue в myCatch, чтобы мне не нужно было получать значение из Request ["Species"]

Заранее спасибо, что нашли время для этого.

1 Ответ

0 голосов
/ 20 ноября 2010

Я не уверен, что это какая-то помощь, но я использую xVal вместо проверки клиента MVC2, и она отлично работает в сценарии, который вы описали. У меня есть много проверенных DropDownLists на стороне клиента, и я в основном их визуализирую с помощью RenderAction.

...