Asp.net mvc 验证错误在asp.net mvc的partialView中不可见

Asp.net mvc 验证错误在asp.net mvc的partialView中不可见,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我有一个带有下拉列表控件和文本框的局部视图 未选择任何内容或未输入任何文本时,ModelState.IsValid为FALSE 但我看不到在我的属性上标注的验证错误 为什么呢?我可以在ModelState.Value.Errors属性中看到一个“Name is” 例如“失踪” 当我确认无效视图时,我在输出窗口中看到: A first chance exception of type 'System.InvalidOperationException' occurred in System.Web

我有一个带有下拉列表控件和文本框的局部视图

未选择任何内容或未输入任何文本时,ModelState.IsValid为FALSE

但我看不到在我的属性上标注的验证错误

为什么呢?我可以在ModelState.Value.Errors属性中看到一个“Name is”

例如“失踪”

当我确认无效视图时,我在输出窗口中看到:

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>   
}
System.Web.Mvc.dll中发生了类型为“System.InvalidOperationException”的首次意外异常
System.Web.Mvc.dll中发生类型为“System.InvalidOperationException”的首次意外异常
System.Web.Mvc.dll中发生类型为“System.InvalidOperationException”的首次意外异常
公共行动结果编辑()
{
返回LoadEditTemplates();
}
[HttpPost]
公共操作结果更新(EditTemplateListViewModel viewModel)
{
if(ModelState.IsValid&!\u templateDataProvider.TemplateExists(viewModel.Name))
{
Template Template=Mapper.Map(viewModel);
_UpdateTemplate(模板);
返回新的JsonNetResult(new{success=true});
}
返回部分视图(视图模型);
}
私有ActionResult LoadEditTemplates()
{
var templates=_templateDataProvider.GetTemplates();
EditTemplateListViewModel editTemplateViewModel=新的EditTemplateListViewModel()
{
DisplayList=Mapper.Map(模板),
};
返回PartialView(editTemplateViewModel);
}
公共类EditTemplateListViewModel
{
[必需(ErrorMessage=“未选择模板”。)]
public int TemplateId{get;set;}
[必需(ErrorMessage=“缺少名称”)]
公共字符串名称{get;set;}
公共IEnumerable显示列表{get;set;}
}
@模型ITMS.Web.Models.EditTemplateListViewModel
@*远程验证*@
@使用(Html.BeginForm(“更新”、“模板”))
{       
@Html.ValidationSummary(false)
@DropDownListFor(x=>x.TemplateId,新的SelectList(Model.DisplayList,“TemplateId”,“Name”),新的{@class=“listviewmodel”})

@Html.LabelFor(model=>model.Name)

@Html.EditorFor(model=>model.Name)

@Html.ValidationMessageFor(model=>model.Name)

}
由于服务器端代码工作正常,我建议检查所需的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>

除了使用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.BeginForm(“更新”、“模板”、新的AjaxOptions{HttpMethod=“POST”、UpdateTargetId=“targetId”}))
{       
@Html.ValidationSummary(false)
@DropDownListFor(x=>x.TemplateId,新的SelectList(Model.DisplayList,“TemplateId”,“Name”),新的{@class=“listviewmodel”})

@Html.LabelFor(model=>model.Name)

@Html.EditorFor(model=>model.Name)

@Html.ValidationMessageFor(model=>model.Name)

}

部分视图的返回类型是String,所以您可以在服务器端捕获它,在ajax选项中,您必须指定HttpMethod和UpdateTargetId,以便在视图中显示您的结果。这里我引用了您的ajax.BegionForm和div,并且给定UpdateTargetId是div Id,以便如果发生错误,它将在同一个div中追加视图

内部控制器

[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();
            }
        }
[HttpPost]
公共字符串更新(EditTemplateListViewModel视图模型)
{
if(ModelState.IsValid&!\u templateDataProvider.TemplateExists(viewModel.Name))
{
Template Template=Mapper.Map(viewModel);
_UpdateTemplate(模板);
返回新的JsonNetResult(new{success=true});
}
返回RenderPartialViewToString(“PartialViewName”,viewModel);
}
受保护的字符串RenderPartialViewToString(字符串视图名、对象模型)
{
if(string.IsNullOrEmpty(viewName))
viewName=ControllerContext.RoutedData.GetRequiredString(“操作”);
ViewData.Model=Model;
使用(StringWriter sw=new StringWriter())
{
ViewEngineResult viewResult=ViewEngines.Engines.FindPartialView(ControllerContext,viewName);
ViewContext ViewContext=新的ViewContext(ControllerContext、viewResult.View、ViewData、TempData、sw);
viewResult.View.Render(viewContext,sw);
返回sw.GetStringBuilder().ToString();
}
}
通过将partialViewName和Model传递给RenderPartialViewToStringit将返回视图的RenderHtml


注意:在使用Ajax.BeginForm之前,请确保添加以下脚本

当我从post操作返回数据时,我意识到参数强制转换异常,因为我没有将数据传递给SelectItem列表“DisplayList”。它是空的,因此砰


我刚刚填充了丢失的数据以重新显示视图,错误是可见的:)见鬼。。。我已经经历过一次失败…

没有帮助。恰恰相反。当我用部分视图打开jquery对话框时,我在输出窗口中看到很多异常。如果部分视图是异步加载的,则需要重新初始化验证插件。检查并异步加载我的所有局部视图。除了jquery.validate.unobtrusive.min.js“之外,我再也不需要任何jquery库了。在我这方面,没有动态内容。今晚我将制作一个运行的示例,您可以看到。我已经使用jquery Ajax表单post使用了Ajax.BeginForm。Ajax.BeginForm只是MVC的“包装器”“。我已检查了您的代码,该代码位于此处:。。。我无法解析Config.Url.ToString()类,该配置类是什么?我不了解Config.Url.ToString(),所以您能告诉我更多详细信息吗