asp.net-mvc-3 - 如何验证列表中的单个项目

标签 asp.net-mvc-3 validation partial-views

我有一个形状像这样的模型:

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;}
}

我的观点叫Html.RenderPartial("SettingView")对于每个 SettingViewModel。
<%@ 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呈现一个回发到 Save 操作的表单。
SettingViewModel正确地从表单中重新水化,并且验证正确确定何时生成超出或范围值。

我退回原件Index查看完整版 GlobalSettingsViewModel这个需要。

但是,当页面呈现 时每 SettingValue 的验证器显示它的错误消息,而不仅仅是具有不正确值的文本框?

PartialView 上执行服务器端验证的正确方法是什么?当它是项目集合的页面时?

更新

所以这就是我所拥有的......看起来有点奇怪,但似乎有效......

我可以一次保存一个设置,并在出现验证错误时显示它们。但是我使用部分模型保存的奇怪方式似乎有点奇怪。

索引.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>

设置 View 模型.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SettingViewModel>" %>
<% using (Html.BeginForm("Save", "GlobalSettings", 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)%>

<%} %>

全局设置 Controller .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,这样您就不必刷新整个页面。因此,您的 Save 操作将返回仅传递当前设置的部分:

[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文件中对这些表单进行AJAX化:
$(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-mvc-3 - 如何验证列表中的单个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8523926/

相关文章:

html - 文件 > 新 MVC 3 项目上的新 "use HTML5 semantic markup"选项

asp.net-mvc-3 - 如何在 orderby 子句中使用动态变量

javascript - HTML 文本框的动态拼写检查器?

angularjs - 为什么在 AngularJS 中加载之前我会看到 {{ ... }} ?

ajax - 如何使用 AJAX 渲染部分内容?拉拉维尔 5.2

c# - 已删除 用户在其他浏览器上删除后仍登录

asp.net-mvc - 是否可以在 ASPX 模式下使用 ViewBag 设置页面标题?

PHP $_POST 验证

jquery - 验证不适用于 jqBootstrapValidation 和 ajax

node.js - nodejs + jade,我们可以像在 ASP.NET 中那样渲染部分 View 吗?