web-dev-qa-db-ja.com

HTML.HiddenFor値セット

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})

動作しません!値の設定方法は?

44
arnoldrob

属性パラメーターに値を設定する必要はありません。 MVCは自動的にバインドします。

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })
27
Daniel A. White

非表示フィールドに値を設定するには、次のようにします。

@Html.HiddenFor(model => model.title, 
                new { id= "natureOfVisitField", Value = @Model.title})

それが動作します

91
user1187093

奇妙ですが、@Valueで試してください、大文字の「V」

例えば(MVC4で作業中)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })

更新:

@Value(大文字のV)が、「値」とともに「値」を持つ別の属性を作成していることがわかりました。小さな@値を使用しても機能しているようです。

詳細については、MVCソースコードを確認する必要があります。


更新、内部的にどのように機能するかを確認した後:

まず第一に、これらすべての回避策を忘れます(ここでは継続性のために続けました)、今は愚かに見えます:)

基本的に、モデルが投稿され、モデルが同じページに戻されるときに発生します。

次のコードを使用して、InputHelperメソッド(InputExtensions.cs)で値にアクセス(およびHTMLに形成)します。

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));

(Htmlelper.csの)GetModelStateValueメソッドは、次の値を取得します。

ViewData.ModelState.TryGetValue(key, out modelState)

値はViewData.ModelStateディクショナリからアクセスされるため、ここに問題があります。これは、変更された値ではなく、ページから投稿された値を返します!!

つまり、変数の投稿された値(Person.Idなど)が0であるが、httpPostアクション内の値(Person.Id = 2など)を設定した場合、ModelStateは古い値「0」とattemptedValueには「0」が含まれます!そのため、レンダリングされたページのフィールドには値として「0」が含まれます!!

モデルを同じページに戻す場合の回避策:ModelStateからアイテムをクリアします。 ModelState.Remove( "Id");

これにより、ディクショナリからアイテムが削除され、ViewData.ModelState.TryGetValue(key、out modelState)はnullを返しますとなり、次のステートメント(InputExtensions.cs内)が実際の値を取ります(valueParameter)HiddenFor(m => m.Id)に渡されます

これは、InputExtensions.csの次の行で実行されます。

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

概要:ModelState.Remove( "...");を使用して、ModelStateのアイテムをクリアします。

これが役に立てば幸いです。

41
Tejasvi Hegde

@valueではなく、単なるValueです。試してみてください。 @ Model.titleについてはわかりませんが、Model.titleだけかもしれません

10
der_chirurg

関連するプロパティを既存のエンティティに追加しようとしたときに、最近自分で問題に遭遇したため、この質問を壊しています。私はちょうど素敵な拡張メソッドを作成しました:

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, TProperty value)
    {
        string expressionText = ExpressionHelper.GetExpressionText(expression);
        string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText);

        return htmlHelper.Hidden(propertyName, value);
    }

次のように使用します:

@Html.HiddenFor(m => m.RELATED_ID, Related.Id)

これは組み込みのHiddenForと似たシグネチャを持っていますが、ジェネリック型付けを使用しているため、ValueがSystem.Object型の場合、実際にはフレームワークに組み込まれたものを呼び出します。ただし、ビューでSystem.Object型のプロパティを編集する理由がわからない...

4
Stevoman

HtmlAttributesを指定する際の@記号は、設定しようとしている「もの」がキーワードc#である場合に使用されます。したがって、たとえばWordクラスでは、クラスを指定できません。@ classを使用する必要があります。

0
Mike