簡體   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