asp.net-mvc-3 – 如何验证列表中的单个项目
我有一个形状如下的模型:
public class GlobalSettingsViewModel { public List<SettingViewModel> Settings{ get;set;} } public class SettingViewModel { public string Name{ get;set;} [Range(0,100)] public decimal SettingValue{ get;set;} } 我的视图为每个SettingViewModel调用Html.RenderPartial(“SettingView”). <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SettingViewModel>" %> <% using (Html.BeginForm("Save","GlobalSettings",FormMethod.Post)) { %> <table> <tr> <td width="150px"> <%= Html.DisplayFor(m=>m.Name) %> </td> <td> <%= Html.TextBoxFor(m=>m.SettingValue) %> </td> <td> <input type="submit" value="Save" class="uiButton" /> <%=Html.ValidationMessageFor(m=>m.SettingValue) %> </td> </tr> </table> <%} %> 每个SettingView都会呈现一个回发到“保存”操作的表单. 从表单中正确地重新水化SettingViewModel,并且验证正确地确定何时生成out或range值. 我使用它需要的完整GlobalSettingsViewModel返回原始的Index视图. 但是,当页面呈现每个Validator for SettingValue时,它会显示错误消息,而不仅仅是具有不正确值的文本框? 当PartialView是一组项目的页面时,在PartialView上执行服务器端验证的正确方法是什么? UPDATE 所以这就是我所拥有的….它看起来有点奇怪,但似乎有效…… 我可以一次保存一个设置,并在发生时显示验证错误.但是我使用局部模型保存的奇怪方式似乎有些奇怪. 的Index.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MVC.Master" Inherits="System.Web.Mvc.ViewPage<GlobalSettingsViewModel>" %> <fieldset style="margin: 5px; width: 350px;"> <legend>Global System Settings</legend> <div> <%= Html.EditorFor(m => Model.Settings)%> </div> </fieldset> SettingViewModel.ascx <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SettingViewModel>" %> <% using (Html.BeginForm("Save",FormMethod.Post)) { %> <table> <tr> <td width="150px"> <%= Model.Name %> </td> <td> <%= Html.TextBoxFor(m => m.SettingValue) %> </td> <td> <input type="submit" value="Save" class="uiButton" /> </td> </tr> <tr> <td colspan="3"> <%=Html.ValidationMessageFor(m=>m.SettingValue) %> </td> </tr> </table> <%= Html.HiddenFor(m => m.SettingName)%> <%= Html.HiddenFor(m => m.Name)%> <%} %> GlobalSettingsController.cs public ActionResult Index() { var settings = GetSettings(); if (TempData["Message"] != null) { settings.Message = TempData["Message"].ToString(); settings.HasMessage = true; } return View(settings); } [AuthorizationFilter(true,null)] [HttpPost] public ActionResult Save(GlobalSettingsViewModel model) { if (ModelState.IsValid) { GlobalSettings.SetGlobalSetting(model.Settings[0].SettingName,model.Settings[0].SettingValue); TempData["Message"] = "Saved " + model.Settings[0].Name; return RedirectToAction("Index"); } var settings = GetSettings(); return View("Index",settings); } 解决方法
一种可能性是使用AJAX,这样您就不必刷新整个页面.因此,您的保存操作将返回仅传递当前设置的部分:
[HttpPost] public ActionResult Save(SettingViewModel model) { // TODO: do some processing return PartialView("SettingView",model); } 然后将表单包装在一个div容器中,以便我们可以更容易地知道AJAX调用成功时要更新的部分: <% foreach (var item in Model.Settings) { %> <div class="setting"> <%= Html.Partial("SettingView",item) %> </div> <% } %> 最后在一些单独的javascript文件中AJAXify这些表单: $(function () { $('.setting').delegate('form','submit',function() { $.ajax({ url: this.action,type: this.method,data: $(this).serialize(),context: this,success: function (result) { $(this).closest('.setting').html(result); } }); return false; }); }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 从ASP.NET网站将查询结果发送到Excel
- 用于学习ASP.Net安全/认证框架的GOOD教程
- asp.net-identity – 支持EF和Asp.NEt身份的IdentityServer
- asp.net – Kendo TabStrip:将动作渲染到MVC 4中的选项卡
- ASP.NET 将字节大小转换为适合阅读的格式M,G,T
- asp.net-mvc – 如何使用状态代码返回客户端错误消息
- asp.net-mvc – 从子页面选择MVC中母版页上的右侧菜单
- ASP.NET自带对象JSON字符串与实体类的转换
- RegisterStartupScript无法在更新面板中工作,无法在asp.net
- 如何在ASP.Net Web API中为特定控制器启用Windows身份验证
- asp.net-mvc-2 – MVC的DataAnnotationsModelMet
- 如何防止密码和其他敏感信息出现在ASP.NET转储中
- asp.net – 在同一站点上使用基本身份验证和表单
- asp.net-mvc – 为什么在MVC中使用bundle会增加内
- asp.net – 如何让Google不会将自定义404错误页面
- asp.net-mvc – 将参数传递给html partial并在部
- ASP.net WebForms – 构造函数与Page_Load
- asp.net – IIS使用代理进行Web服务请求.怎么阻止
- asp.net-mvc – Asp.Net MVC和HTML5 PUSH通知
- 在ASP.NET web.config全球标记中设置日期格式?