繁体   English   中英

自动补全后完成模型状态

[英]Completing the modelstate after autocompletion

所以这是我遇到的问题。

最初,我是用一个首先要成为朋友的用户选择列表填充收件人字段的。

这对我来说似乎不够用户友好。 因此,我开始使用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的检查,或者是否应该以更好的方式解决此问题。

你为什么不尝试这样的事情:

$("#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
                            }
                        }))
                    }
                });
            },

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

我解决了这样的问题

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM