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())
希望对您有所帮助。
将表单提交给控制器后,如果来自控制器的视图 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())
希望对您有所帮助。