Model view controller 如何使用列表填充下拉列表<;字符串>;使用knockout.JS

Model view controller 如何使用列表填充下拉列表<;字符串>;使用knockout.JS,model-view-controller,knockout.js,Model View Controller,Knockout.js,我正在玩knockoutJS,并且正在努力从我的模型中获取填充数据的下拉列表 我猜我需要先将模型数据转换成JSON,但我一直无法理解 我有一门基础课: public class QuoteViewModel { public QuoteViewModel() { QuoteLines = new List<QuoteLine>(); } public int QuoteHeaderId { get; set; } publi

我正在玩knockoutJS,并且正在努力从我的模型中获取填充数据的下拉列表

我猜我需要先将模型数据转换成JSON,但我一直无法理解

我有一门基础课:

public class QuoteViewModel
{
    public QuoteViewModel()
    {
        QuoteLines = new List<QuoteLine>();
    }

    public int QuoteHeaderId { get; set; }

    public string QuoteNumber { get; set; }
    public string Status { get; set; }
    public DateTime DateCreated { get; set; }

    [DisplayName("Customer")]
    public SalesCustomer SelectedCustomer { get; set; }
    public List<string> Customers { get; set; }
    public List<QuoteLine> QuoteLines { get; set; }    
}
注释掉的代码使用ajax获得客户并将其推送到阵列上,这是可行的,但是没有直接从模型数据执行的方法吗

编辑1:

我不需要访问整个SalesCustomer对象,只需要字符串名称:

如果我更改了我的代码:

控制器:

[HttpGet]
public ActionResult CreateQuote()
{
    QuoteViewModel quote = new QuoteViewModel();
    quote.QuoteNumber = "";
    quote.Status = "P";
    quote.Customers = _dbContext.SalesCustomers.Select(x => x.CustomerName).ToList();
    quote.QuoteLines = new List<QuoteLine>();

     return View(quote);
}
 quote.Customers = _dbContext.SalesCustomers.Select(x => x.CustomerName.Trim()).ToList();
模型类属性:

 public List<string> Customers { get; set; }
现在,下拉列表中填充了客户名称的字符串值。但是,所选客户未在POST上传回控制器

编辑2:

嗯,我不知道为什么它现在能工作,但它是

代码与“编辑1”中的代码相同

我唯一能想到的是,我错误地将SelectedCustomer属性类型设置为SalesCustomer,这显然不起作用:

public SalesCustomer SelectedCustomer { get; set; }
何时应该:

public string SelectedCustomer { get; set; }

感谢用户3297291为我指明了正确的方向。

您的
选项
绑定的设置方式表明
availableCustomers
应该是一个对象数组,而不是字符串。您是否尝试从您的
Model.Customers
属性中删除
Select(x=>x.CustomerName)
?如果只想处理字符串客户名称,则必须删除
选项text
绑定…然后将我的属性设置为List Customers{get;set;},然后使用self.availableCustomers=JSON.parse('@Html.Raw(Model.Customers)');我希望这能起作用,但我不能肯定没有见过您的
SalesCustomer
型号。试试看,你很快就会知道的!另外,如果您以后需要通过AJAX更新
availableCustomers
,请确保它是
observableArray
。如果您只输入客户的姓名,客户端将不会发布整个模型。如果需要发布整个模型,应使用
选项text
绑定。另外,请确保这样设置可观察对象:
self.availableCustomers(JSON.parse(customers))
设置
选项的方式表明
availableCustomers
应该是一个对象数组,而不是字符串。您是否尝试从您的
Model.Customers
属性中删除
Select(x=>x.CustomerName)
?如果只想处理字符串客户名称,则必须删除
选项text
绑定…然后将我的属性设置为List Customers{get;set;},然后使用self.availableCustomers=JSON.parse('@Html.Raw(Model.Customers)');我希望这能起作用,但我不能肯定没有见过您的
SalesCustomer
型号。试试看,你很快就会知道的!另外,如果您以后需要通过AJAX更新
availableCustomers
,请确保它是
observableArray
。如果您只输入客户的姓名,客户端将不会发布整个模型。如果需要发布整个模型,应使用
选项text
绑定。另外,请确保这样设置可观察对象:
self.availableCustomers(JSON.parse(customers))
<select class="form-control" id="SelectedCustomer" data-bind="options: availableCustomers, value: SelectedCustomer, optionsCaption: 'Choose...'"></select>
 self.availableCustomers = ko.observableArray([]);
 var customers = '@Html.Raw(JsonConvert.SerializeObject(Model.Customers))';
 self.availableCustomers = JSON.parse(customers);
 self.SelectedCustomer = ko.observable();
public SalesCustomer SelectedCustomer { get; set; }
public string SelectedCustomer { get; set; }