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; }
}

最后是消息模型。显然我没有所有这些字段,所以这就是为什么模型状态对我哭泣。

我想知道在这种情况下我是否可以跳过检查模型状态,或者我是否应该以更好的方式解决这个问题。

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 回答