2017-07-25 11 views
0

モデルをビューに渡してから、ビューのuser.BannEndDateを変更してコントローラに戻したいと思います。 私はuser.BannEndDateで何をしても、ActionLinkは到着したモデルによって設定された値を常に渡します。誰もそれで私を助けることができますか?MVC Editor for dateはforeachループのサブプロパティを更新しません。

[モデル]

[DataType(DataType.Date)] 
public DateTime? BannEndDate { get; set; } 

[表示]

@foreach (var user in Model.Users) 
{ 
    @Html.ActionLink("Bann", "BannUser", "Account", new { userId = user.Id, bann = true, bannEndDate = user.BannEndDate} , null) 
    @Html.EditorFor(u => user.BannEndDate) 
} 

[コントローラー]

public ActionResult BannUser(string userId, bool bann, DateTime? bannEndDate){} 
+1

'ActionLink'がレンダリングされているため、予想される動作です'user.BannEndDate'は前の値です。これがASP.NET MVCのようなサーバー側フレームワークの本質です。それをサーバーに送り返したい場合は、フォームに入れて送信してください。 'ActionLink'をクライアント側で更新したい場合は、クライアント側のコードを使う必要があります。つまり、JavaScriptです。スタックオーバーフローでこれを行う方法について、いくつかの質問があります。 –

+0

私はeditorforもクライアント側の価値を更新すると思っています。ありがとうございます。 – chrisk

+0

'ActionLink()'を使うのではなく、 'FormMethod.Get'を使ってテキストボックスの値をあなたのGETメソッドにポストバックします(javascriptは必要ありません) –

答えて

0

マイクMcCaughanは、すでに述べたように、彼らは「以来、@Html.ActionLinkの値は、静的であり、あなたがそのページを呼び出すときに書かれています。

あなたのできることは、ActionLinkEditorForに特定のIDを指定することです。

その後
@Html.ActionLink("Bann", "BannUser", "Account", new { userId = user.Id, bann = true, bannEndDate = user.EndDate }, new { @id = "TargetLink_" + user.Id }) 
@Html.EditorFor(m => user.BannEndDate, null, "BannEndDate_" + user.Id) 

あなたはjQueryを経由して、これらのコントロールの変化に耳を傾け、あなたのActionLinkのを変更することができます(userId = 3BannEndDate_3TargetLink_3になります):

$('input[id*="BannEndDate_"]').change((e) => { 
    var userId = e.target.id.substr(e.target.id.indexOf("_") + 1); 
    var link = $("#TargetLink_" + userId).attr('href'); 
    $("#TargetLink_" + userId).attr('href', link.replace(/(bannEndDate=.*$)/g, 'bannEndDate=' + encodeURIComponent($("#" + e.target.id).val()))); 
}); 
+0

素晴らしい答えをありがとう、私はRazorはすべてのサイトスコープでモデルを即座に更新すると思って、すべてのメソッドは参照されたオブジェクト値が変更されますが、方法。 – chrisk

+0

本当にそれをしたいのであれば、単にPOST( '[HttpPost]')メソッドを使い、 'Model'をコントローラに渡してください。 – jAC

関連する問題