@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})
動作しません!値を設定する方法は?
@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})
動作しません!値を設定する方法は?
非表示フィールドに値を設定するには、次のようにします。
@Html.HiddenFor(model => model.title,
new { id= "natureOfVisitField", Value = @Model.title})
それが動作します
奇妙ですが@Value
、大文字で試してください"V"
例(MVC4での作業)
@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })
アップデート:
@Value(資本V)が「value」とともに「Value」を使用して別の属性を作成していることがわかりました。小さな@valueを使用しても機能しているようです。
詳細については、MVCソースコードを確認する必要があります。
更新、内部でどのように機能するかを確認した後:
まず第一に、これらすべての回避策を忘れてください(私はここで継続性のために維持しました)、今はばかげているように見えます:)
基本的には、モデルが投稿され、モデルが同じページに戻されたときに発生します。
次のコードフラグメントを使用して、InputHelperメソッド(InputExtensions.cs)で値にアクセス(およびhtmlに形成)されます
string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));
GetModelStateValueメソッド(Htmlelper.cs内)は、次のように値を取得します。
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内)はHiddenFor(m => m.Idに渡された実際の値(valueParameter )を取ります)。
これは、InputExtensions.csの次の行で行われます。
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);
概要:
以下を使用して、ModelStateのアイテムをクリアします。
ModelState.Remove("...");
これがお役に立てば幸いです。
属性パラメーターに値を設定する必要はありません。MVCは自動的にそれをバインドする必要があります。
@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })
@valueではなく単なるValueです。試してみてください。@ Model.titleについてはよくわかりませんが、Model.titleだけかもしれません。
関連するプロパティを既存のエンティティに追加しようとしたときに、最近自分で問題に遭遇したため、この質問をネクロします。私はちょうどいい拡張メソッドを作ることになりました:
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タイプのプロパティを編集する理由はわかりませんが...
HtmlAttributesを指定するときの@記号は、設定しようとしている「もの」がキーワードc#の場合に使用されます。したがって、たとえば品詞の場合、クラスを指定することはできません。@classを使用する必要があります。
あなたはこのようにすることができます
@Html.HiddenFor(model=>model.title, new {ng_init = string.Format("model.title='{0}'", Model.title) })