【问题标题】:Validation not working using Data annotation in mvc验证在 mvc 中使用数据注释不起作用
【发布时间】:2011-10-04 10:21:57
【问题描述】:

我已经创建了带有验证的视图模型,但是当我提交表单时验证不起作用,下面是代码:

namespace Products.Models
{
[MetadataType(typeof(SampleFormViewModelMetaData))]
public partial class SampleFormViewModel
{
    public SampleFormViewModel() { }

    public Venue venues { get; set; }
    public Accomodation accomodation { get; set; }
}

public class SampleFormViewModelMetaData
{


    [Required(ErrorMessage = "*")]
    public object ProductName { get; set; }

    [Required(ErrorMessage = "*")]
    public object ProductDescription { get; set; }

    [Required(ErrorMessage = "*")]
    public object ProductWebsite { get; set; }

    [Required(ErrorMessage = "Tel required")]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public object ProductTel { get; set; }
}

}

查看

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/ApexAdmin.Master" Inherits="System.Web.Mvc.ViewPage<ApexTrackDays.Models.SampleFormViewModel>" %>
            <div class="editor-label">
            <%: Html.LabelFor(model => model.accomodation.ProductName)%>
        </div>
        </td>
        <td>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.accomodation.ProductName, new { style = "width:300px;" })%>
            <%: Html.ValidationMessageFor(model => model.accomodation.ProductName)%>
        </div>
        </td>
        </tr>

        <tr><td colspan="2">
        <div class="editor-label">
            <%: Html.LabelFor(model => model.accomodation.ProductDescription)%>
        </div>
        </td>
        </tr><tr><td colspan="2">
        <div class="editor-field">
            <%: Html.TextAreaFor(model => model.accomodation.ProductDescription, new { @class = "tinymce" })%>
            <%: Html.ValidationMessageFor(model => model.accomodation.ProductDescription)%>
        </div>

       </td></tr>

        <tr><td>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.accomodation.ProductWebsite)%>
        </div>
        </td><td>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.accomodation.ProductWebsite, new { style = "width:300px;" })%>
            <%: Html.ValidationMessageFor(model => model.accomodation.ProductWebsite)%>
        </div>
        </td></tr> </table>

控制器

[HttpPost]
    public ActionResult Create(FormCollection formValues)
    {
       // ApextrackdaysEntities entity = new ApextrackdaysEntities();
        IAccomodationTypeRepository AccomodationResp = new AccomodationTypeRepository();
        ITrackRepository trackResp = new TrackRepository();
        IQueryable<Object> tracks = trackResp.GetVenuesSelectlist();
        ViewData["Venue"] = new SelectList(tracks, "VenueID", "Name");
        Accomodation accomodation = new Accomodation();
        if (TryUpdateModel(accomodation))
        {
            accomodation.DateAdded = DateTime.Now;
            accomodation.DateModified = DateTime.Now;
            accomResp.Add(accomodation);
            accomResp.Save();
            int AccomodationID = accomodation.ID;
            int VenueID = Convert.ToInt16(formValues["Venue"]);
            AccomodationType type = new AccomodationType();
            type.AccomodationID = AccomodationID;
            type.TrackID = VenueID;

            AccomodationResp.Add(type);
            AccomodationResp.Save();


            return RedirectToAction("Index", new { id = accomodation.ID });
        }
        return View(accomodation);

    }

【问题讨论】:

  • 您接受回发的控制器操作是什么样的?
  • 返回模型有效,表示验证未完成
  • 我添加了后置控制器

标签: asp.net-mvc asp.net-mvc-2 validation viewmodel data-annotations


【解决方案1】:

您应该使用元数据类将验证应用于现有模型字段/属性,因此:

namespace Products.Models
{

    [MetadataType(typeof(SampleFormViewModelMetaData))]
    public partial class SampleFormViewModel
    {
        public SampleFormViewModel() { }

        public Venue venues { get; set; }
        public Accomodation accomodation { get; set; }

        public object ProductName { get; set; }
        public object ProductDescription { get; set; }
        public object ProductWebsite { get; set; }
        public object ProductTel { get; set; }
    }

    public class SampleFormViewModelMetaData
    {


        [Required(ErrorMessage = "*")]
        public object ProductName { get; set; }

        [Required(ErrorMessage = "*")]
        public object ProductDescription { get; set; }

        [Required(ErrorMessage = "*")]
        public object ProductWebsite { get; set; }

        [Required(ErrorMessage = "Tel required")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public object ProductTel { get; set; }
    }

}

--编辑--

进一步查看您的代码,您似乎正在尝试将验证应用于住宿类中的字段,而不是 SampleFormViewModel。您似乎只有一个住宿实例,因此您的视图模型可能不应该将住宿对象传递给视图,而是应该提取字段并将它们作为视图模型呈现(我不确定这是否可行)您应该将您的元数据类应用于住宿对象,而不是 SampleFormViewModel。

【讨论】:

  • 那是因为您为Model.accommodation.ProductName 提供了编辑器,而不是Model.ProductName。阅读我上面的编辑。
  • 但是我想在一个视图中使用多个模型,这就是为什么我创建一个视图模型并传递两个实体模型,即场地和住宿,因为我稍后将在看法。我想在视图中使用两个表的属性并进行验证检查,希望它有意义
  • 我知道您正在尝试做什么,但您根本不了解验证的工作原理。具体来说,验证 MetaData 类具有精确映射到目标类的字段定义。您不能声明适用于具有相同名称的子对象的所有字段的验证。两个类具有完全相同的字段集和相同的验证要求是极不可能的,如果是这种情况,那么它们本质上是同一个类,并且可能应该从应用了验证元数据的公共基类继承。
  • 所以我应该为住宿和场地实体创建单独的元数据,但是强类型数据将如何将两个实体的验证映射到单个视图上
  • 您正在向视图提供两个类,以便应用元数据。所以是的,您需要为每个类设置元数据。
【解决方案2】:

在您的 .cshtml 文件中包含 jqueryvalidate。例如,如果脚本已捆绑在您的 BundleConfig 文件中,那么您的代码将如下所示

@section scripts
 {
     @Scripts.Render("~/bundles/jqueryval")
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多