MVC-Modell-Eigenschaft null-auf-posting-Formular
Entwickle ich ein MVC 4-Anwendung und ich bin mit problem bezwingend eine form mit stark view-Modell.
Ich rufe eine Teilansicht, wo in der actionResult erkläre ich eine model-Instanz und übergeben Sie den partiellen view und speichern Sie die Felder in hidden-fields.
Beim Debuggen sehe ich, dass alle Felder sind immer Werte, und es funktioniert gut.
Nachdem der Benutzer das Formular sendet, benutze ich dieses Modell Eigenschaften plus die Eigenschaften ausgefüllt, die durch die Benutzer.
Das problem ist, dass in der Liste ist immer null beim Aufruf der post-action-Ergebnis.
Den Controllern:
[HttpGet]
public ActionResult MessageDetails(string id)
{
MessageModel m;
string userfullname = String.Empty;
ServiceReference2.WebService1Soap ws = new ServiceReference2.WebService1SoapClient();
DataTable dt = ws.GetMessageDetails("bcce7f7ad7596f963f4adb23d713e0d4", "329392de8a55edf86c0881a57381cbe6",id,User.Identity.Name).Tables[0];
if (Session["user"] != null)
userfullname = ((HaifanetMobile.Models.LoginModel)Session["user"]).LoginDS.Tables[0].Rows[0][((HaifanetMobile.Models.LoginModel)Session["user"]).LoginDS.Tables[0].Columns["fullname"].Ordinal].ToString();
m = new MessageModel(dt, User.Identity.Name, userfullname);
return PartialView("MessageDetails",m);
}
[HttpPost]
public ActionResult ReplyMessage(MessageModel model)
{
//here's where the To list is getting empty
var errors = ModelState.Values.SelectMany(v => v.Errors);
if (ModelState.IsValid)
{
model.Send();
return Content("Success");
}
return PartialView("MessageDetails",model);
}
Ansicht:
@model HaifanetMobile.Models.MessageModel
<script type="text/javascript">
function showMessagesPanel1() {
$('#messagedetails_panel').toggle();
$("#messages_panel").show();
}
$(function () {
$('form').submit(function () {
$.validator.unobtrusive.parse($('form')); //added
if ($(this).valid()) {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (result) {
alert("Message Sent");
},
error: function () {
alert("Error");
}
});
}
return false;
});
});
</script>
<table id="messages_panel_mbar" cellpadding="0" cellspacing="0">
<tr>
<td class="left_mbar">
</td>
<td class="main_mbar">
</td>
<td id="back_msg_details" class="right_mbar"></td>
</tr>
</table>
<div style="height:10%; width:100%; font: bold; font-size: 20px; text-align:right;"> @Html.Raw(Model.Subject)</div>
<div id="msg_chat" style="text-align:right; width:100%; height:auto; max-height:80%; overflow-y:scroll;">
@Html.Raw(Model.MsgHistory)
</div>
<div id="reply_msg" style="height: 5%">reply</div>
<div id="reply_msg_block" class="visible" style="width:100%; height:45%;">
@using (Ajax.BeginForm("ReplyMessage", "SettingsMenu", null, new AjaxOptions { }, new { @class = "center_form" }))
{
@Html.ValidationSummary(true, "");
<fieldset style="height:75%">
@Html.Hidden("Subject", Model.Subject)
@Html.Hidden("ParentId", Model.ParentId)
@Html.Hidden("From", Model.From)
@Html.Hidden("fullnamesender", Model.fullnamesender)
@Html.Hidden("To", Model.To)
<div id="textarea_msg_reply">
@Html.TextAreaFor(m => m.Content, new { @class = "" })
@Html.ValidationMessageFor(m => m.Content)
</div>
</fieldset>
<input type="submit" value="send" />
}
</div>
Modell:
public class MessageModel
{
public string From { get; set; }
[Required(ErrorMessage = "Enter To")]
public List<Contact> To { get; set; }
[Required(ErrorMessage = "Enter Subject")]
[StringLength(100, ErrorMessage = "Max 1000 chars")]
public string Subject {get; set;}
[StringLength(1000, ErrorMessage = "Max 1000 chars")]
public string Content { get; set; }
public string MsgHistory { get; set; }
public string fullnamesender { get; set; }
public string ParentId { get; set; }
public DateTime LastMsgDate { get; set; }
public bool readed = false;
} //I omitted the constructors....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf diese Frage und die Antwort.
Mit ASP.NET und MVC 3, wie kann ich ausgeblendete Felder so, dass eine Liste mit einem array als Wert von jedem Element in der Liste bindet, richtig?
HiddenFor ist in der Regel einfacher zu verwenden, aber es wird nicht Ihr problem lösen sich von selbst. Sollten Sie eine versteckte für jede Eigenschaft jede Liste Element, das Sie verwenden möchten, nach dem postback.
Jedoch würde ich nicht empfehlen, diesen Ansatz. Sollten Sie nur Platz ein verstecktes Feld für die id der ursprünglichen Nachricht, und suchen Sie die Empfängerliste nach dem postback.