Bit của một trường hợp lạ đối với bất kỳ ai có suy nghĩ về nó… Tôi đang hiển thị trường Boolean ẩn trên một trang cụ thể. Tuy nhiên, tôi nhận được hai đánh dấu hơi khác nhau cho cùng một lĩnh vực tùy thuộc vào việc một sự kiện cụ thể đã xảy ra trước đó trong quá trình. Hai trường được tạo ra là;Trường Boolean được hiển thị với các trường hợp khác nhau
<input id="HasPreviouslyIssuedCard" name="HasPreviouslyIssuedCard" type="hidden" value="false" />
và
<input id="HasPreviouslyIssuedCard" name="HasPreviouslyIssuedCard" type="hidden" value="False" />
Vấn đề là trường hợp của các văn bản trong “giá trị” thuộc tính mà bạn sẽ nhận thấy là khác nhau và sau đó ảnh hưởng đến điều kiện JS. Việc đánh dấu dao cạo tạo ra điều này là;
@Html.Hidden("HasPreviouslyIssuedCard", Model.HasPreviouslyIssuedCard?.ToString(), new { id = nameof(Model.HasPreviouslyIssuedCard) })
Tuy nhiên, tôi cũng đã thử một biến thể bằng cách sử dụng sự khác biệt tương tự trong hiển thị trường ẩn;
@Html.HiddenFor(m => m.HasPreviouslyIssuedCard)
Tôi nên làm gì để có sự khác biệt này? Để có được biến thể chữ hoa, tôi nhấn nút Quay lại trình duyệt trước khi đến trang có liên quan. Cả hai phương thức tải dữ liệu theo cùng một cách và chuyển cùng một giá trị vào trình kết xuất theo cùng một cách. Hai đầu ra khác nhau.
Hãy nhớ rằng đây là trường boolean, kiểu giá trị được hiển thị. Không nên có nhiều phạm vi để tinker với. Có nhiều cách để giải quyết vấn đề này nhưng vì chúng tôi có một vài mục về việc tồn đọng liên quan đến các trường boolean và nút quay lại, tôi muốn giải thích điều này thay vì làm việc xung quanh nó. Dự đoán tốt nhất của tôi là nhấn nút quay lại bằng cách nào đó thay đổi trạng thái của trình kết xuất hoặc một số cờ khác trong mô hình khác (có hơn 70 trường là thuật sĩ) đang thay đổi cách trình kết xuất diễn giải như thế nào để trường hợp giá trị boolean. Giá trị là như nhau, trang giống nhau, dữ liệu được đọc theo cùng một cách.
Dựa trên trang này (Why does Boolean.ToString output "True" and not "true"), chúng ta nên giả định là nhận được biến thể chữ hoa tất cả các thời gian nhưng điều này không phải là kết quả.
Bất kỳ người tạo/ý tưởng/suy nghĩ nào?
EDIT 1
Đào thông qua logic vẽ MVC trong HiddenFor()
phương pháp, cuối cùng Convert.ToString(value, CultureInfo.CurrentCulture)
được gọi. Tôi không thể có được điều này để sản xuất một boolean trường hợp thấp hơn khi được gọi trực tiếp, nhưng rõ ràng là làm như vậy. Mã văn hóa hiện tại của tôi được đặt thành en-IE
nhưng tôi thấy giá trị boolean chữ hoa khi gọi trực tiếp.
EDIT 2
tôi đã thực hiện nhiều hơn một chút mày mò và truy tìm thông qua ứng dụng của tôi và có thể cung cấp một chi tiết chút về những gì đang xảy ra mặc dù tôi vẫn chưa thể tái sản xuất này trong một đơn giản hơn ứng dụng.
MVC 5 Ứng dụng: Có;
- Trang đích ban đầu có URL đích tại miền gốc
/
được truy xuất qua HTTPGET
.Thẻ Booleaninput
hiển thị dưới dạngTrue
/False
- Trang đầu tiên trong trình hướng dẫn tại URL
/Apply
được truy xuất qua HTTPGET
. Thẻ Booleaninput
hiển thị dưới dạngTrue
/False
- Trang thứ hai trong trình hướng dẫn tại cùng một URL sau khi người dùng gửi trang ở bước 2. Truy xuất qua HTTP
POST
. Hiện tại, các thẻinput
hiển thị làtrue
/false
. - Nhấn nút Quay lại của trình duyệt và nhấn trang bẫy (chúng tôi đặt lịch sử trình duyệt để luôn truy cập trang bẫy trên Quay lại khi phát nội dung thú vị với trình hướng dẫn).
- Nút lần truy cập của người dùng trên trang bẫy để đưa họ trở lại ứng dụng mà họ đã dừng lại.
input
thẻ hiện đang hiển thị lại ở dạng chữ hoa (vấn đề được báo cáo ban đầu).
Tôi đã đào sâu vào các thư viện MVC sử dụng ILSpy để thử và quét qua và MVC (nếu tôi đọc mã chính xác) thực sự sử dụng một thực hiện IConverter
để viết giá trị boolean, không Convert.ToString(value, CultureInfo.CurrentCulture)
như tôi ban đầu nghĩ.
Ngăn xếp mã truy tìm từ cuộc gọi đến HiddenFor()
là (tôi nghĩ);
System.Web.Mvc.InputExtentions.HiddenFor()
(public function)System.Web.Mvc.InputExtentions.HiddenHelper()
(chức năng riêng, một số logic vào đây để mảng nhưng không áp dụng trong trường hợp của chúng tôi)System.Web.Mvc.InputExtentions.InputHelper()
(chức năng riêng, kỳ diệu xảy ra ở đây)
Mã được biên dịch cho System.Web.Mvc.InputExtentions.InputHelper()
;
private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary<string, object> htmlAttributes)
{
string fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
if (string.IsNullOrEmpty(fullHtmlFieldName))
{
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");
}
TagBuilder tagBuilder = new TagBuilder("input");
tagBuilder.MergeAttributes<string, object>(htmlAttributes);
tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType));
tagBuilder.MergeAttribute("name", fullHtmlFieldName, true);
string text = htmlHelper.FormatValue(value, format);
bool flag = false;
switch (inputType)
{
case InputType.CheckBox:
{
bool? flag2 = htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(bool)) as bool?;
if (flag2.HasValue)
{
isChecked = flag2.Value;
flag = true;
}
break;
}
case InputType.Hidden:
goto IL_131;
case InputType.Password:
if (value != null)
{
tagBuilder.MergeAttribute("value", text, isExplicitValue);
goto IL_16C;
}
goto IL_16C;
case InputType.Radio:
break;
default:
goto IL_131;
}
if (!flag)
{
string text2 = htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string)) as string;
if (text2 != null)
{
isChecked = string.Equals(text2, text, StringComparison.Ordinal);
flag = true;
}
}
if (!flag && useViewData)
{
isChecked = htmlHelper.EvalBoolean(fullHtmlFieldName);
}
if (isChecked)
{
tagBuilder.MergeAttribute("checked", "checked");
}
tagBuilder.MergeAttribute("value", text, isExplicitValue);
goto IL_16C;
IL_131:
string text3 = (string)htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string));
tagBuilder.MergeAttribute("value", text3 ?? (useViewData ? htmlHelper.EvalString(fullHtmlFieldName, format) : text), isExplicitValue);
IL_16C:
if (setId)
{
tagBuilder.GenerateId(fullHtmlFieldName);
}
ModelState modelState;
if (htmlHelper.ViewData.ModelState.TryGetValue(fullHtmlFieldName, out modelState) && modelState.Errors.Count > 0)
{
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
}
tagBuilder.MergeAttributes<string, object>(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));
if (inputType == InputType.CheckBox)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing));
TagBuilder tagBuilder2 = new TagBuilder("input");
tagBuilder2.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden));
tagBuilder2.MergeAttribute("name", fullHtmlFieldName);
tagBuilder2.MergeAttribute("value", "false");
stringBuilder.Append(tagBuilder2.ToString(TagRenderMode.SelfClosing));
return MvcHtmlString.Create(stringBuilder.ToString());
}
return tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing);
}
EDIT 3
Chỉ cần để xác định lại như có một vài ý kiến về bên javascript của sự vật. Tôi đã xem xét điều này sớm trong việc cố gắng chẩn đoán vấn đề. Để loại trừ bất kỳ sự can thiệp/thao tác JS tiềm năng nào, tôi đã sử dụng Fiddler để nắm bắt HTML trong quá trình truyền. HTML mà MVC đang tạo ra đang thay đổi trường hợp - và tôi có thể thấy điều này trong Fiddler, tại một điểm trước khi JS thậm chí tải, không bao giờ chạy. Nó không phải là một vấn đề JS.
Không liên quan nhưng nó chỉ '@ Html.Hidden ("HasPreviouslyIssuedCard")' - mà sẽ tạo ra 'giá trị' và 'id' thuộc tính giống như' @ Html.HiddenFor (m => m.HasPreviouslyIssuedCard) ' –
@StephenMuecke đó là do thiết kế – DiskJunky
Không thể nào có thể có một tập lệnh đang chạy thay đổi giá trị của trường ẩn này? – brijber