自动完成后完成模型状态

时间:2012-09-26 04:27:36

标签: c# jquery asp.net-mvc

所以这就是我遇到的问题。

最初,我填写了收件人字段,其中列出了一个首先会有用户选择的用户。

这对我来说似乎不够用户友好。所以,我开始使用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; }
}

最后是消息模型。 显然我没有所有这些领域,所以这就是为什么模型状态在哭我。

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

2 个答案:

答案 0 :(得分: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
                            }
                        }))
                    }
                });
            },

我的意思是......您使用用户名作为表单的标签,但是在发送电子邮件时将电子邮件作为您真正想要使用的值传递。

答案 1 :(得分: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);
    }
}

但我对解决方案不满意,因为它绕过了我的整个验证过程