加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 09:50:23 所属栏目:asp.Net 来源:网络整理
导读:我有一个形状如下的模型: public class GlobalSettingsViewModel{ public ListSettingViewModel Settings{ get;set;}}public class SettingViewModel { public string Name{ get;set;} [Range(0,100)] public decimal SettingValue{ get;set;}} 我的视图为
我有一个形状如下的模型:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读