MaskedTextBoxFor 在提交 MVC Razor 视图后失去价值

MaskedTextBoxFor loses value after submitting the MVC Razor View

将表单提交给控制器后,如果来自控制器的视图 returns MaskedTextBoxFor 输入将丢失其值,而所有其他值(textboxdor、dropdownlistfor)在提交时保持不变。那么,当从控制器提交视图 returns 时,如何使 MaskedTextBoxFor 值保持不变?提前致谢...

查看(更新):

@model EurodeskMultipliers.Domain.Entities.Multiplier


@using (Html.BeginForm("Create", "Multiplier", FormMethod.Post,
new { id = "createForm", enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()

    <div class="container">

        <fieldset>
            <section>
                <div class="legend-left">                        

                    @Html.LabelFor(m => m.Phone)
                    @(Html.Kendo().MaskedTextBoxFor(m => m.Phone).Mask("(0999) 000 00 00"))
                    @Html.ValidationMessageFor(m => m.Phone)
                    <br />                       

                    @Html.LabelFor(m => m.ContactPhone)
                    @(Html.Kendo().MaskedTextBoxFor(m => m.ContactPhone).Mask("(0999) 000 00 00"))
                    <br />

                    @Html.LabelFor(m => m.ContactMobile)
                    @(Html.Kendo().MaskedTextBoxFor(m => m.ContactMobile).Mask("(0999) 000 00 00"))
                    @Html.ValidationMessageFor(m => m.ContactMobile)
                    <br />
                </div>
            </section>
        </fieldset>

        <div class="dv-right">
            @(Html.Kendo().Button()
                .Name("submitbtn")
                .Content("Save")
            )                
        </div>
    </div>
}


控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Exclude = null)] Multiplier multiplier)
{
    try
    {
        if (ModelState.IsValid)
        {
            return View(); //FOR TESTING "MaskedTextBox"

            db.Multipliers.Add(multiplier);
            db.SaveChanges();
            return RedirectToAction("Completed");
        }
    }
    catch (RetryLimitExceededException /* dex */)
        {
        //Log the error (uncomment dex variable name and add a line here to write a log.)
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
    }

    return View(multiplier);
}


型号:

public class Multiplier
{
    public int ID { get; set; }

    [Required(ErrorMessage = "Required")]
    [RegularExpression(@"\([0-9]{4}\) [0-9]{3} [0-9]{2} [0-9]{2}", ErrorMessage = "Check phone number.")] 
    [MaxLength(20)]
    [Display(Name = "Phone")]
    public string Phone { get; set; }

    [Required(ErrorMessage = "Required")]
    [RegularExpression(@"\([0-9]{4}\) [0-9]{3} [0-9]{2} [0-9]{2}", ErrorMessage = "Check phone number.")] 
    [MaxLength(20)]
    [Display(Name = "Mobile Phone")]
    public string ContactMobile { get; set; } 

    //Navigation property       
    public virtual InstituteStatus InstituteStatus { get; set; }

    [ForeignKey("TermID")]
    public virtual Lookup Lookup { get; set; }

    //Collection navigation property
    public virtual ICollection<Participant> Participants { get; set; }

    //For using two Foreign Key on the same (Multiplier) table 
    [ForeignKey("MultiplierCityID")]
    [InverseProperty("MultiplierCityMultipliers")]
    public virtual City MultiplierCity { get; set; }

    [ForeignKey("ContactCityID")]
    [InverseProperty("ContactCityMultipliers")]
    public virtual City ContactCity { get; set; }
}

如果您查看 Telerik here 上的 ASP.NET MVC 示例。您会发现您使用的是 MaskedTextBoxFor 而不是 MaskedTextBox。以下是该站点的示例代码:

@(Html.Kendo().MaskedTextBox()
    .Name("phone_number")
    .Mask("(999) 000-0000")
    .Value("555 123 4567")
)

此处您要将 .Name("phone_number") 替换为 .Name("Phone")

在您原始问题的 Controller 代码片段中,您有以下行:

return View(); //FOR TESTING "MaskedTextBox"

该值未绑定到 MultiSelectFor(),因为您没有将模型传递回视图。如果将其更改为以下内容,它应该可以工作:

return View(multiplier);

最后我看到使用带有 class 选项 "k-textbox" 的 @Html.TextBoxFor() 解决了问题并且可能存在与 Html.Kendo().MaskedTextBox 有关的问题().因为除了它以外,其他都是一样的,所以对于那些可能遇到问题的人,我在下面发布了该字段的最后状态。另一方面,非常感谢@jumpingcode、OnaBai 和@mmillican 的帮助。我对他们的答案投了赞成票。

@Html.LabelFor(m => m.Phone)
@Html.TextBoxFor(m => m.Phone, new { maxlength = 13, @class = "k-textbox", placeholder = "+49xxxxxxxxxx" })
@Html.ValidationMessageFor(m => m.Phone)

我的其中一份表格遇到了同样的问题。 MaskedTextBoxFor razor 扩展似乎没有查看 ModelState 中的值。因此,如果验证失败并重新加载表单,则部分表单将重新填充,但 phone 数字不会。

所以我简单地使用了一个普通的@Html.TextBoxFor,但是通过javascript手动添加了kendo掩码并且它工作正常。

我在使用 MaskTextBox 时遇到了同样的问题,但对我来说幸运的是,我在一个不相关的问题上遇到了类似的问题。我的 maskedtextbox 用于 Phone 数字字段,我已将其放置在编辑器模板中。

@model string
@(Html.Kendo()
    .MaskedTextBox()
    .Name(Html.IdForModel().ToString())
    .Mask("000-000-0000")            
    .Deferred())

对于上一个问题,我通过查看模型的模型状态并查看它是否具有 attemptedValue(来自失败的验证)来解决它。然后,如果确实如此,我将其设置为 MaskedTextBox 值选项。更新后的编辑器模板如下。

@model string
@{ 
    string attemptedValue = "";
    ModelState modelStateForValue = Html.ViewData.ModelState[Html.IdForModel().ToString()];
    if (modelStateForValue != null)
    {
        attemptedValue = modelStateForValue.Value.AttemptedValue;
    }
}
@(Html.Kendo()
    .MaskedTextBox()
    .Name(Html.IdForModel().ToString())
    .Mask("000-000-0000")    
    .Value((!string.IsNullOrEmpty(attemptedValue)) ? attemptedValue : "")
    .Deferred())

希望对您有所帮助。