1

DropDownListコントロールとテキストボックスを含む部分ビューがあります。

何も選択されていないか、テキストが入力されていない場合ModelState.IsValidはFALSEです

しかし、プロパティに注釈が付けられて表示された検証エラーは表示されません。

何故ですか?ModelState.Value.Errorsプロパティに、「名前は

たとえば「行方不明」。

無効なビューを確認すると、出力ウィンドウに次のように表示されます。

A first chance exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll
A first chance exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll
A first chance exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll


public ActionResult Edit()
{
    return LoadEditTemplates();
}


[HttpPost]
public ActionResult Update(EditTemplateListViewModel viewModel)
{
    if (ModelState.IsValid && !_templateDataProvider.TemplateExists(viewModel.Name))
    {
        Template template = Mapper.Map<EditTemplateListViewModel, Template>(viewModel);
        _templateDataProvider.UpdateTemplate(template);
        return new JsonNetResult(new { success = true });
    }

    return PartialView(viewModel);
}

private ActionResult LoadEditTemplates()
{
    var templates = _templateDataProvider.GetTemplates();
    EditTemplateListViewModel editTemplateViewModel = new EditTemplateListViewModel()
    {
        DisplayList = Mapper.Map<IEnumerable<Template>, IEnumerable<TemplateViewModel>>(templates),
    };
    return PartialView(editTemplateViewModel);
}

public class EditTemplateListViewModel
    {
        [Required(ErrorMessage = "No template selected.")]
        public int TemplateId { get; set; }

        [Required(ErrorMessage="Name is missing")]
        public string Name { get; set; }

        public IEnumerable<TemplateViewModel> DisplayList { get; set; }      
    }

@model ITMS.Web.Models.EditTemplateListViewModel

@*Remote Validation*@
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm("Update", "Template"))
{       
    @Html.ValidationSummary(false)
    @Html.DropDownListFor(x => x.TemplateId, new SelectList(Model.DisplayList, "TemplateId", "Name"), new { @class = "listviewmodel" })

    <p class="editor-label">@Html.LabelFor(model => model.Name)</p>
    <p class="editor-field">@Html.EditorFor(model => model.Name)</p>
    <p class="editor-field">@Html.ValidationMessageFor(model => model.Name)</p>   
}
4

3 に答える 3

1

Insated of Html、BeginFormを使用してAjax.BeginFormを使用して部分ビューを送信します

   //In partial View 


<div id="targetId">
     @using (Ajax.BeginForm("Update", "Template", new AjaxOptions { HttpMethod="POST", UpdateTargetId="targetId"}))
        {       
            @Html.ValidationSummary(false)
            @Html.DropDownListFor(x => x.TemplateId, new SelectList(Model.DisplayList, "TemplateId", "Name"), new { @class = "listviewmodel" })

            <p class="editor-label">@Html.LabelFor(model => model.Name)</p>
            <p class="editor-field">@Html.EditorFor(model => model.Name)</p>
            <p class="editor-field">@Html.ValidationMessageFor(model => model.Name)</p>   
        }

部分ビューの戻りタイプは文字列であるため、サーバー側でキャッチできます。ajaxオプションでは、結果をビューに表示する場所でHttpMethodとUpdateTargetIdを指定する必要があります。ここでは、Ajax.BegionFormをdivで引用し、UpdateTargetIdを指定します。エラーが発生した場合に同じdivにビューを追加するようにDivId

コントローラ内

[HttpPost]
public string Update(EditTemplateListViewModel viewModel)
{
    if (ModelState.IsValid && !_templateDataProvider.TemplateExists(viewModel.Name))
    {
        Template template = Mapper.Map<EditTemplateListViewModel, Template>(viewModel);
        _templateDataProvider.UpdateTemplate(template);
        return new JsonNetResult(new { success = true });
    }

    return RenderPartialViewToString("PartialViewName",viewModel);
}



protected string RenderPartialViewToString(string viewName, object model)
        {
            if (string.IsNullOrEmpty(viewName))
                viewName = ControllerContext.RouteData.GetRequiredString("action");

            ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
                ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
                viewResult.View.Render(viewContext, sw);
                return sw.GetStringBuilder().ToString();
            }
        }

partialViewNameとModelをRenderPartialViewToStringitに渡すと、ビューのRenderHtmlが返されます。

注:Ajax.BeginFormを使用する前に、必ず次のスクリプトを追加してください。

于 2012-10-16T07:02:15.027 に答える
1

ポストアクションからデータを返したとき、たとえばSelectItemリスト "DisplayList"にデータを渡さなかったため、引数キャスト例外に気付きました。それはヌルだったので、強打しました...

ビューを再表示するために不足しているデータを入力したところ、エラーが表示されます:)一体...私はすでにその失敗に一度踏み込んだ...

于 2012-10-21T15:36:53.087 に答える
0

サーバー側のコードは正常に機能しているため、必要なJQueryライブラリが正しく読み込まれているかどうかを確認することをお勧めします。

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
于 2012-10-15T21:43:59.650 に答える