1

コメント欄があります。ビューには、コメント エディター ボックスのみがあります。

@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\abc123post メソッドに渡され、ModelStatefor にも設定されUserNameます。私はいくつかの作業を行い、userNametoを変更し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);
    });
});
4

1 に答える 1