如何将 ASP MVC 窗体下拉列表设置为空白,但仅当基础值未初始化时
How to set ASP MVC form dropdown to blank but only if the underlying value is uninitialised?
我们有一个普通的 ASP.NET MVC表单,其中包含许多字段。第一个字段是最重要的,它是一个下拉列表。假设它是公司字段,它包含两个值"可口可乐"和"百事可乐"。
公司字段如下所示:
<div class="editor-label">
@Html.LabelFor(Function(model) model.Company)
</div>
<div class="editor-field">
@Html.DropDownListFor(Function(model) model.Company, TryCast(ViewData("Companies"), SelectList), New With {Key .style = "blah blah;"})
@Html.ValidationMessageFor(Function(model) model.Company)
</div>
因为积极做出这个选择很重要,而不是仅仅因为它是按字母顺序排列的,就简单地留在"可口可乐"上,我们首先需要字段为空(验证数据注释负责强制用户输入一些东西)。
这很容易用Javascript完成,就像这样:
function InitialiseForm() {
$('#Company').prop('selectedIndex', -1);
}
window.onload = InitialiseForm;
但是,在某些情况下,表单没有完全加载为空白,而是在控制器中初始化了公司字段,如下所示:
modelObject.Company = "Coca Cola"
在这种情况下,我们当然不希望Javascript执行并删除它。
在这种情况下,正常的解决方案是什么?
我的假设是正确的:如果初始值为 null,则DropDownListFor
不会生成 selected
属性。
对于空公司,它会生成以下 html:
<select id="Company" name="Company">
<option value="1">Coca-Cola</option>
<option value="2">Pepsi</option>
</select>
与选定的公司 html 代码不同:
<select id="Company" name="Company">
<option selected="selected" value="1">Coca-Cola</option>
<option value="2">Pepsi</option>
</select>
所以你可以使用这个javascript代码,它将工作:
$(function () {
if ($("#Company").find("option[selected]").length == 0) {
$("#Company").prop('selectedIndex', -1);
}
});
此外,如果您的 jquery 版本低于 1.9.0,则 option[selected]
表达式可能无法正常工作。该错误在 1.9.0 中已修复,但在早期版本中,"filter"、"child"和"is"等函数无法正常工作,而 "find" 和 "has" 返回了正确的结果。
几天前我遇到了类似的问题,希望将我的下拉列表默认为第一个索引,除非它在某个时候被选中。 我使用会话变量作为补救措施...像这样的东西可能会解决问题:
var CurrentCompanyID = 1;
var gCompanyID = '@(Convert.ToInt32(Session["CompanyID"]))';
if (gCompanyID == null || gCompanyID == '' || gCompanyID == 0) {
CurrentCompanyID = 1;
}
else {
CurrentCompanyID = gCompanyID;
$("#CompanyDropDown").val(CurrentCompanyID);
}
$("#CompanyDropDown").change(function () {
CurrentCompanyID = $(this).val();
$.ajax({
url: "Controller/ChangeCompany",
cache: false,
data: { _compID: CurrentCompanyID },
success: function (result) {
console.log(result);
$("#CompanyForm").submit();
}
});
});
// Where:
public JsonResult ChangeCompany(int _compID)
{
Session["CompanyID"] = _compID;
return Json(Session["CompanyID"], JsonRequestBehavior.AllowGet);
}
。对于当前控制器的 Index() 操作:
var _compID = Convert.ToInt32(Session["CompanyID"]);
var dataContext = new SERVERDataContext();
if (Session["CompanyID"] == null)
{
//Get Companies
return View(vm);
}
else
{
//Get Companies where Company.ID == _compID
return View(vm);
}
所以本质上,我将下拉列表的当前值设置为会话变量的值。 如果我想更改下拉值,我只需为会话变量分配一个新值! 当会话 var 为 null 或毫无价值时,请将下拉列表设置为我想要的索引。
希望这有帮助。
这里有一个干净的方法:
在列表中添加一个可选标签,如果模型公司值为空,则会选择它,否则将显示预选当前值(不需要javaScript选择代码),此外如果用户没有选择值他无法通过验证:
@Html.DropDownListFor(Function(model) model.Company, TryCast(ViewData("Companies"), SelectList), "Select a company", New With {Key .style = "blah blah;"})
@{
var listItems = new SelectList(new List<SelectListItem>
{
new SelectListItem { Value = "1", Text = "drink 1" },
new SelectListItem { Value = "2", Text = "drink 2" },
new SelectListItem { Value = "3", Text = "drink 3" }
}, "Value", "Text");
var selectedDrink = "";
}
@Html.DropDownListFor(x => selectedDrink, listItems, "--select drink--")
"--选择饮料--"除非设置了所选项目,否则将显示。
(为简洁起见,代码仅在 View 中编写)
选项 1:
您可以将逻辑放在控制器的操作方法中。
例如:控制器
public ActionResult LoadForm()
{
var companies = new List<Company>();
var isSpecialCase = false;
if (default)
{
companies.Add(new Company {
CompanyId = 1,
CompanyName = "Coca Cola"
});
companies.Add(new Company
{
CompanyId = 2,
CompanyName = "Pepsi"
});
}
else if (yourSpecialCase)
{
isSpecialCase = true;
companies.Add(new Company {
CompanyId = 1,
CompanyName = "Coca Cola"
});
}
else
{
//define any other implementations...
}
ViewBag.IsSpecialCase = isSpecialCase;
ViewBag.Companies = companies;
return View();
}
公司类别
public class Company {
public int CompanyId { get; set; }
public string CompanyName { get; set; }
}
在您的表单中(注意如果是特殊情况,可选标签将不显示)
@if (ViewBag.IsSpecialCase)
{
@Html.DropDownListFor(model => model.Data, new SelectList(ViewBag.Companies as List<Company>, "CompanyName", "CompanyId"))
}
else
{
@Html.DropDownListFor(model => model.Data, new SelectList(ViewBag.Companies as List<Company>, "CompanyName", "CompanyId"), "Select a company...")
}
选项 2:
创建自定义下拉列表(自定义 html 帮助程序)
请参考以下链接。链接 1链接 2
- 使用javascript函数在页面初始化后加载jquery
- 未捕获错误:无法在初始化之前调用方法;
- 如何在剑道网格初始化后设置pageSizes
- React redux初始化功能,无论状态变化如何
- 为什么可以't Protractor在自动初始化的Angular网站上查找Angular
- 尝试初始化()Spine's控制器和故障
- Angular.js延迟控制器初始化
- 对插件初始化后动态加载的元素进行样式设置
- Angular JS控制器初始化错误
- 在XMLHttpRequest之后重新初始化jQuery
- ember-js组件初始化不同的函数
- Youtube JavaScript API不是't正在初始化
- 函数无法识别初始化的变量
- datepicker引导程序再次初始化
- jquery数据表在初始化时设置宽度
- 如何使用app和secret进行安全的解析初始化
- 从javascript中再次初始化c变量
- 有了字段的名称,我如何用空白数据初始化对象的未定义字段
- 如何将 ASP MVC 窗体下拉列表设置为空白,但仅当基础值未初始化时
- 初始化jQuery返回空白页的数据表