0

少なくとも1つを選択しない場合、モデル検証はリストボックス値にリンクされた属性を評価しません。この方法では、必要な値を通知するためにDataAnnotationsを使用してモデル評価を行うことはできません。

コントローラー:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TestValidation.Models;

namespace TestValidation.Controllers
{
  [HandleError]
  public class HomeController : Controller
  {
    private SelectList list = new SelectList(new List<string>()
        {
            "Sao Paulo",
            "Toronto",
            "New York",
            "Vancouver"
        });
    public ActionResult Index()
    {
      ViewData["ModelState"] = "NOT EVAL";
      ViewData["ItemsList"] = list;
      return View();
    }
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(MyEntity entity)
    {
      if (ModelState.IsValid)
      {
        ViewData["ModelState"] = "VALID";
      }
      else
      {
        ViewData["ModelState"] = "NOT VALID!!!";
      }
      ViewData["ItemsList"] = list;
      return View();
    }

    public ActionResult About()
    {
      return View();
    }

  }
}

景色:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TestValidation.Models.MyEntity>" %>

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
  Home Page
</asp:Content>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
  <h2>
    Validation Test</h2>
  <p>
  <% using (Html.BeginForm())
     {%>
  <fieldset>
    <p>
      ModelState:
      <%= Html.Encode((string)ViewData["ModelState"])%>
    </p>
    <p>
      <label for="Name">
        Name:</label>
      <%= Html.TextBoxFor(m => m.Name)%>
      <%= Html.ValidationMessageFor(m => m.Name)%>
    </p>
    <p>
      <label for="ItemFromList">
        Items (list):</label>
      <%= Html.ListBoxFor(m => m.ItemFromList, ViewData["ItemsList"] as SelectList)%>
      <%= Html.ValidationMessageFor(m => m.ItemFromList)%>
    </p>
    <p>
      <label for="ItemFromCombo">
        Items (combo):</label>
      <%= Html.DropDownListFor(m => m.ItemFromCombo, ViewData["ItemsList"] as SelectList)%>
      <%= Html.ValidationMessageFor(m => m.ItemFromCombo)%>
    </p>
    <p>
      <input type="submit" value="Submit" />
    </p>
  </fieldset>
  <% } %>
</asp:Content>

モデル:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;


namespace TestValidation.Models
{
  public class MyEntity_Validate : ValidationAttribute
  {
    public MyEntity_Validate()
    {
      this.ErrorMessage = "Validated!. Is <> Toronto";
    }
    public override bool IsValid(object value)
    {
      return ((string)value == "Toronto");
    } 
  }
  public class MyEntity
  {
    [Required]
    public string Name { get; set; }
    [MyEntity_Validate]
    public string ItemFromList { get; set; }
    [MyEntity_Validate]
    public string ItemFromCombo { get; set; }
  }
}

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

0

本当に良いニュースです!

VS2010では、ASP.NETMVCのバージョンを更新するにはRCが必要です。これを確認してください:http ://www.nitrix-reloaded.com/2010/03/15/install-asp-net-mvc-2-rtm-on-vs2010-rc/

于 2010-03-31T12:39:29.587 に答える
0

この問題は既知ですが、MVC 開発チームは現在、機能を変更する予定はありません ( http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=4858 )。

spmason ブログ投稿: http://spmason.com/post/343293206/why-aspnetmvc-2-is-broken

個人的には、機能がわかりにくいという意見に同意します。フィールドが必須で渡されない場合、ModelState は無効です。

于 2010-01-20T15:39:05.133 に答える