コメント欄があります。ビューには、コメント エディター ボックスのみがあります。
@using (Html.BeginForm(new { courseID = @ViewBag.courseID, userName = @User.Identity.Name }))
{
@Html.ValidationSummary(true)
<div class="NewComment">
<div class="editor-field">
@Html.TextAreaFor(model => model.CommentText, new { maxLength = 500})
@Html.ValidationMessageFor(model => model.CommentText)
</div>
<input type="submit" class="PostComment" value="Post Comment" />
<div id="Counter" class="CommentCounter"/>
</div>
}
モデルには、コメントがリンクされているコース、日付、コメント テキスト、およびユーザーもあります。他の値は create post メソッドに入力されます。
[HttpPost]
public ActionResult AddComment(CourseComment coursecomment, int courseID, String userName)
{
userName = userName.Split('\\')[1];
coursecomment.CommentDate = System.DateTime.Now;
coursecomment.CourseID = courseID;
coursecomment.UserName = db.Users.FirstOrDefault(u => u.UserName == userName).UserID;
if (ModelState.IsValid)
{
db.CourseComments.AddObject(coursecomment);
db.SaveChanges();
}
return RedirectToAction("Details", "Course", new { courseID = courseID });
}
ここで問題が発生します。モデルは、実際に作業を行って設定する前にuserName
、値のパラメーターを使用しようとしています。courseComment.UserName
設定された後、ModelState
変更されません。
たとえば、domain\abc123
post メソッドに渡され、ModelState
for にも設定されUserName
ます。私はいくつかの作業を行い、userName
toを変更しabc123
てリンクされた ID を見つけます。ID = 1 と言って、その名前のユーザーにそれを差し込んで、courseComment.UserName
ModelState
まだそこに残しdomain\abc123
、モデルは無効のままです。
現在、これは元の作業でしたが、主に列名といくつかの関係だけで、基礎となるデータベースを変更しました。
これに対する私の解決策。
post メソッドからユーザー名を受け取って移動する
[HttpPost]
public ActionResult AddComment(CourseComment coursecomment, int courseID)
{
coursecomment.CommentDate = System.DateTime.Now;
coursecomment.CourseID = courseID;
coursecomment.UserName = db.Users.FirstOrDefault(u => u.UserName == userName).UserID; //Moved
if (ModelState.IsValid)
{
db.CourseComments.AddObject(coursecomment);
db.SaveChanges();
}
return RedirectToAction("Details", "Course", new { courseID = courseID });
}
get メソッドに。
[HttpGet]
public JsonResult GetUserName(string userName)
{
var ret = db.Users.FirstOrDefault(u => u.UserName == userName).UserID;
return Json(ret, JsonRequestBehavior.AllowGet);
}
次に、ビューを次のように変更しました
@Html.HiddenFor(model => model.UserName)
....
<script type="text/javascript">
$(function () {
var userName = '@User.Identity.Name.Split('\\')[1]';
$.ajax({
url: '@Url.Action("GetUserName", "CourseComment")',
data: { userName: userName },
type: 'get'
}).done(function (data) {
$('#UserName').val(data);
});
});