0

この便利な例を読みましたhttp://msdn.microsoft.com/en-us/library/gg508808%28v=vs.98%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2 MVC3 でのリモート検証用であり、新しいアイテムを作成するときにうまく機能します。しかし、新しく作成したアイテムを編集しようとすると困ってしまいます。

私はこのようなモデルを持っています

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
Imports System.Web.Mvc
Imports System.Collections.Generic

Public Class Language

    Public Property LanguageId As Integer

    <Display(Name:="DisplayNameLanguageName", ResourceType:=GetType(Resources.Language)),
        Required(ErrorMessageResourceName:="ErrorMessageLanguageNameRequired", ErrorMessageResourceType:=GetType(Resources.Language)),
        StringLength(20),
        Remote("IsNameAvailable", "Language", "AdminArea", ErrorMessageResourceName:="ErrorMessageNameNotAvailable", ErrorMessageResourceType:=GetType(Resources.Language))>
    Public Property Name As String

    Public Property Flag as String    
End Class

私が持っているコントローラの「言語」クラスでは...

   'OutputCache needed for remote validation
   <OutputCache(Location:=OutputCacheLocation.None, NoStore:=True)>
    Public Class LanguageController
        Inherits System.Web.Mvc.Controller

        Private db As StoreEntities = New StoreEntities

        'remote validation for duplicates
        Public Function IsNameAvailable(Name As String) As JsonResult
            Return Json(Not db.Languages.Any(Function(x) x.Name = Name), JsonRequestBehavior.AllowGet)
        End Function

[...]

ビューの「Create.vbhtml」からは新しい言語を作成できますが、「Edit.vbhtml」からはバリデーションが始まるため Name に同じ値を残して Flag プロパティだけを編集することはできません。Name プロパティも変更せざるを得ません。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

Edit.vbhtmlビューで値として言語の名前を持つ隠しフィールド「HiddenName」を追加し、コントローラーで検証関数を次のように編集する問題を解決しました

Public Function IsNameAvailable(Name As String, Optional HiddenName As String = "") As JsonResult
    If Name <> HiddenName Then
        Return Json(Not db.Languages.Any(Function(x) x.Name = Name), JsonRequestBehavior.AllowGet)
    Else
        Return Json(True, JsonRequestBehavior.AllowGet)
    End If
End Function
于 2012-12-22T15:11:14.073 に答える