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

Posted

技术标签:

【中文标题】MaskedTextBoxFor 在提交 MVC Razor 视图后失去价值【英文标题】:MaskedTextBoxFor loses value after submitting the MVC Razor View 【发布时间】:2015-02-22 23:29:03 【问题描述】:

将表单提交给控制器后,如果视图从控制器返回,则 MaskedTextBoxFor 输入会丢失其值,而所有其他值(textboxdor、dropdownlistfor)在提交时仍保留。那么,当提交的视图从控制器返回时,如何使 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; 

【问题讨论】:

提交表单后,页面是否正在重新加载? 当然。像这样的情况:我填写输入字段并将 Razor 视图提交给控制器。然后,如果出现问题,视图将返回输入及其数据,但 MaskedTextBoxFor 除外。因此,由于此问题,用户需要再次重新键入所有电话字段。我认为有与 Dropdownlist 相关的类似问题,但我的问题仅与 MaskedTextBoxFor 有关。你能帮忙吗? 当我分配的值与掩码不匹配时,我看到了同样的效果,然后 Kendo 根本不显示该值。据我了解,这在您的情况下不会发生,因为您最初分配了一个值,然后发送到控制器,控制器返回相同的值以供用户查看(最后一个假设是否正确?) @OnaBai:实际上我宁愿在第一次初始化期间不分配任何值。用户输入他/她的电话号码,然后将表单提交给控制器。那么,它可能会导致问题吗? 我的意思是,当它从服务器返回并“失去其价值”时,该值是否正确,不是吗?如果您在初始化中分配相同的值,它会显示吗? 【参考方案1】:

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

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

这里你想用.Name("Phone")替换.Name("phone_number")

【讨论】:

我也尝试使用 MaskedTextBox() 而不是 MaskedTextBoxFor()。但这没有任何意义,回传后电话值仍然丢失:( @H.Johnson 我在本地测试了自己,它使用MaskedTextBox而不是MaskedTextBoxFor工作 感谢您的帮助。你能告诉我如何在控制器上测试它吗?实际上我在保存记录之前使用 return(view) 以便回发到视图?我应该如何测试它? @H.Johnson 请在问题中包含您的控制器方法 @H.Johnson 和您的 Multiplier 视图模型以及视图中的完整表单。【参考方案2】:

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

所以我简单地使用了一个普通的@Html.TextBoxFor,但通过 javascript 手动添加了剑道掩码,效果很好。

【讨论】:

【参考方案3】:

在您原始问题的 Controller 代码 sn-p 中,您有以下行:

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

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

return View(multiplier);

【讨论】:

是的,我知道这一点。但是在添加这条测试线之前,结果已经是一样的了。另一方面,如何在保存操作之前测试控制器上的回发是否导致来自控制器的视图? 我不明白您评论中的第二个问题 - 关于在控制器上测试帖子是否会导致视图? 我的意思是:在某些情况下,视图在回发后从控制器返回,即发布创建表单。我怎样才能使程序像那样运行?我尝试在控制器中的保存操作之前使用返回视图(模型)。有没有更合乎逻辑的方式?【参考方案4】:

最后我看到使用带有类选项“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)

【讨论】:

那么你是怎么做掩蔽的?手动?你上面的标记没有这么说。 通过使用@Html.TextBoxFor()。 @binary 他在问你如何格式化电话号码 @dotnetter 通过使用上面问题上发布的模型中的正则表达式。【参考方案5】:

我在使用 MaskTextBox 时也遇到过同样的问题,但幸运的是,我遇到了一个与此无关的类似问题。我的 maskedtextbox 用于电话号码字段,我已将其放置在编辑器模板中。

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

对于上一个问题,我通过查看模型的模型状态并查看它是否有尝试值(来自失败的验证)来解决它。然后,如果是,我将其设置为 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())

希望这会有所帮助。

【讨论】:

以上是关于MaskedTextBoxFor 在提交 MVC Razor 视图后失去价值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jquery AJAX 调用 MVC Action 然后在 MVC 中提交表单?

不提交表单的 MVC 表单验证

提交 MVC 后在同一视图中显示结果

无法在 MVC 中提交模型列表 [重复]

表单提交两次mvc

在提交按钮 C# MVC 上获取上传的文件