2017-07-25 55 views
0

我將模型傳遞給視圖,然後我想在視圖中更改user.BannEndDate並將其發送回控制器。 無論我用user.BannEndDate ActionLink做什麼,都會傳遞由到達模型設置的值。任何人都可以幫助我嗎?MVC EditorFor日期不更新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。關於如何在Stack Overflow上做這個問題有很多問題。 –

+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 = 3將導致BannEndDate_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會立即在所有站點範圍內更新Model,並且每個方法都會更改參考對象值,但它是錯誤的辦法。 – chrisk

+0

如果你真的想這樣做,只需使用POST('[HttpPost]')方法並將'Model'傳遞給Controller。 – jAC