1

だからここに私が遭遇している問題があります。

もともと、私は受信者フィールドに、最初に友達になったユーザーの選択リストを入力していました。

それは私には十分にユーザーフレンドリーではなかったようです。そこで、jQueryを使用したオートコンプリートの作業を開始しました。オートコンプリートは魅力のように機能します。

私が遭遇している問題は、私がメッセージを送信するときです、私modelstateはメッセージとして有効ではありません。受信者にはユーザー名のみが入力されています。

検証を取り除き、これらすべてのフィールドに手動で入力する必要がありますか?それとも、この問題でもっと賢いことをすることができますか?

<div class="label">@Html.LabelFor(model => model.Receiver.UserName)</div>
<div class="fullinput">@Html.TextBoxFor(model => model.Receiver.UserName)</div><br />

<div class="label">@Html.LabelFor(model => model.Subject)</div>
<div class="fullinput">@Html.TextBoxFor(model => model.Subject)</div><br />

<div class="label">@Html.LabelFor(model => model.Content)</div>
<div class="fullinput">@Html.TextAreaFor(model => model.Content)</div><br />

それが私が使用しているhtmlです。

$("#Receiver_UserName").autocomplete({ 
            source: function (request, response) {
                $.ajax({
                    url: "/Function/FindUsers", // Or your controller
                    dataType: "json",
                    data: { usr: request.term },
                    success: function (data) {
                        // Returned data follows the Spellword model
                        response($.map(data, function (item) {
                            return {
                                id: item.Id,
                                label: item.UserName,
                                value: item.UserName
                            }
                        }))
                    }
                });
            },

これはオートコンプリート呼び出しです。

[HttpPost]
    public ActionResult Send(Message message)
    {
        User user = entities.Users.SingleOrDefault(u => u.UserName.Equals(User.Identity.Name));
        //ViewData["Friends"] = new SelectList(user.Friends, "Id", "Name");

        if (ModelState.IsValid)
        {
            entities.Messages.Add(message);
            entities.SaveChanges();

            return RedirectToAction("Index");
        }
        return View(message);
    }

そこで検証をチェックしますが、それは常に無効であり、理にかなっていると思います。

public class Message
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage = "Subject is required")]
    [Display(Name = "Subject")]
    public string Subject { get; set; }

    [Required(ErrorMessage = "Message is required")]
    [Display(Name = "Message")]
    public string Content { get; set; }

    [Required]
    [Display(Name = "Date")]
    public DateTime Created { get; set; }

    public Boolean Read { get; set; }

    [Required(ErrorMessage = "Can't create a message without a user")]
    public int SenderId { get; set; }
    public virtual User Sender { get; set; }

    [Required(ErrorMessage = "Please pick a recipient")]
    public int ReceiverId { get; set; }
    public virtual User Receiver { get; set; }
}

そして最後にメッセージモデル。明らかに、私はこれらすべてのフィールドを持っていないので、これがmodelstateが私に泣いている理由です。

この場合、modelstateのチェックをスキップできるのか、それとももっと良い方法でこれを修正する必要があるのか​​、疑問に思っています。

4

2 に答える 2

1

次のようなことを試してみませんか。

$("#Receiver_UserName").autocomplete({ 
            source: function (request, response) {
                $.ajax({
                    url: "/Function/FindUsers", // Or your controller
                    dataType: "json",
                    data: { usr: request.term },
                    success: function (data) {
                        // Returned data follows the Spellword model
                        response($.map(data, function (item) {
                            return {
                                id: item.Id,
                                label: item.UserName,
                                value: item.Email  //Don't pass the name as value
                            }
                        }))
                    }
                });
            },

つまり...フォームのラベルとしてユーザー名を使用しますが、メールを送信するときに実際に使用する値としてメールを渡します。

于 2012-09-26T06:41:49.680 に答える
0

私はこのような問題を解決しました

[HttpPost]
public ActionResult Send(Message message)
{
    User user = entities.Users.SingleOrDefault(u => u.UserName.Equals(User.Identity.Name));
    User recipient = entities.Users.SingleOrDefault(u => u.UserName.Equals(message.Receiver.UserName));
    ModelState.Clear();

    if (recipient != null && user != null)
    {
        message.Sender = user;
        message.SenderId = user.Id;
        message.Receiver = recipient;
        message.ReceiverId = recipient.Id;
        message.Created = DateTime.Now;

        entities.Messages.Add(message);
        entities.SaveChanges();

        return RedirectToAction("Index");
    }
    else
    {
        return View(message);
    }
}

しかし、検証プロセス全体を回避するため、このソリューションにはあまり満足していません。

于 2012-09-26T18:52:57.660 に答える