PartialView и ненавязчивая проверка клиента не работают - PullRequest
6 голосов
/ 15 ноября 2010

В настоящее время я использую ASP.NET MVC3 RC и использую ненавязчивые проверки JQuery, как описано Брэдом Уилсоном в его блоге .Это прекрасно работает, но когда я отправляю свою форму (в Ajax) на сервер, я делаю некоторые проверки на стороне сервера и возвращаю ту же строку (которая включена в частичное представление), если мое состояние модели недопустимо.2 проблемы с этим:

1-й: Когда я делаю return PartialView в своем действии, все ненавязчивые атрибуты не отображаются.Я нашел «не элегантный» способ сделать это, но когда я делаю это, проверки клиента нарушаются.После того, как я вернусь из своего действия, даже если я вызову jQuery.validator.unobtrusive.parse() в моей обновленной строке, $("form").valid() всегда вернет истину, даже если это не так.

2-й: я хочу, чтобы мой визуализированный вид отображался какстрока на сервере, чтобы я мог отправить ее обратно в JsonResult (например: myJSonResult.html=RenderPartialToString("partialName",model)).

Имеет ссылку, вот мое мнение (editInvitation):

<td>
    <%= Html.HiddenFor(x=>x.ID,new{id="ID"}) %>
    <%= Html.HiddenFor(x=>x.GroupID,new{id="GroupID"})  %>
    <%: Html.TextBoxFor(x => x.Name, new { id = "Name" })%><%:Html.ValidationMessageFor(x=>x.Name) %>
</td>
<td>
    <%: Html.TextBoxFor(x => x.Email, new { id = "Email" })%>  <%:Html.ValidationMessageFor(x=>x.Email) %>
</td>
<td>
    <%: Model.Status.ToFriendlyName()%>
</td>
<td>
  <%= InvitationsViewModel.RenderActions(Model, Html, InvitationsViewModel.CreateRowID(Model.ID))%>
</td>

И мой контроллердействие:

if (TryUpdateModel(invitation))
{
    validModel = true;
    //Other stuff
}
if (Request.IsAjaxRequest())
{
     //TODO : I return a partial view but I would prefer to return a JSonResult with the rendered view as a string in an Property of my JSon result
     return PartialView(validModel ? "DisplayInvitation" : "EditInvitation", invitation);
}

Спасибо

1 Ответ

4 голосов
/ 24 ноября 2010

Я наконец заставляю это работать.Вот как:

HtmlHelper helper = GetHelper();
MvcHtmlString partialView = helper.Partial("myView" , model);
var result = new { success = ModelState.IsValid, html = partialView.ToString() };
return Json(result);

Есть вспомогательные функции:

protected HtmlHelper GetHelper()
{
    return GetHelper(string.Empty);
}
protected HtmlHelper GetHelper(string formID)
{
    HtmlHelper helper = new HtmlHelper(getViewContext(formID), new ViewPage { ViewData = this.ViewData });
    helper.EnableClientValidation(isClientValidationEnabled());
    helper.EnableUnobtrusiveJavaScript(isUnobtrusiveJavascriptEnabled());
    return helper;
}
private ViewContext getViewContext(string formID)
{
    var vc = new ViewContext(this.ControllerContext, new WebFormView(this.ControllerContext, "~/Views/Home/Index.aspx"), this.ViewData, new TempDataDictionary(), new System.IO.StringWriter());
    vc.UnobtrusiveJavaScriptEnabled = isUnobtrusiveJavascriptEnabled();
    vc.ClientValidationEnabled = isClientValidationEnabled();
    vc.FormContext = new FormContext { FormId = formID };
    return vc;
}

Я не уверен, что это лучший способ сделать это, но у меня это сработало.Будем надеяться, что команда ASP.NET MVC предоставит более простой способ визуализации представления в виде строки.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...