DropDown选择中的ASP.Net MVC更新ViewModel已更改

时间:2015-03-25 13:33:09

标签: c# html asp.net-mvc viewmodel onchange

起初我对网络开发非常陌生。我正在尝试开发一个由单个页面组成的Web应用程序(我从一个试图遵循mvc模式的空项目开始)。

要填充我的视图,我将ViewModel通过我的HomeController传递给我的" Home" View。

现在我想根据DropDown选择更改一些Label-Texts。

视图模型:

public IEnumerable<Models.Language> AvailableLanguages;
public Models.Language SelectedLanguage
Public IEnumerable<Models.Text> Content;

语言:

public int ID;
public string LanguageText;

文本:

public Language Language;
public string Description;

HTML: @model ViewModels.MyViewModel

<div>
    @Html.DropDownFor(x => x.AvailableLanguages, 
    new SelectList(Model.AvailableLanguages, 
    "ID", 
    "LanguageText", 
    new {@onchange= ... })) 
</div>

<div>
    @{
        @:@Model.MyViewModel.Content
        .Where(o => o.Language.Equals(Model.SelectedLanguage)
        .First())
        .Description
     }
</div>

我读了一些关于这个&#34; @ onchange&#34;属性(Ajax,JQuery) - 但说实话,如果有任何ASP / MVC / HTML解决方案可以实现我的目标,那么每次下拉的选定项目发生变化时都要更新我的SelectedLanguage属性。< / p>

另外:你可以推荐一个web开发教程(asp,html,ajax,jquery,js)吗?

感谢名单!

修改

现在我尝试实现提供的代码,但似乎在更改所选项目时没有任何反应......

脚本:

<div class="LanguageSelection">
        @{
            @Html.DropDownList("SelectedLanguage", new SelectList(Model.AvailableLanguages, "ID", "Description"))
            <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript">
                var url = '@Url.Action("ChangeLanguage", "Home")';
                $('#SelectedLanguage').change() {
                    $.getJSON(url, {
                        ID: $(this).val() 
                    }, function(response){
                        $('#Title').text(response.Title);   
                    });
                };
            </script>
        }
    </div>

JsonResult:

public JsonResult ChangeLanguage(int id) {
        var data = new {
            Title = HVM.Title.Where(o => o.Language.ID.Equals(id)).First(),
        };
        return Json(new { success = true });
    }

问题应该位于脚本的某个位置,ChangeLanguage方法甚至不会被执行。

2 个答案:

答案 0 :(得分:6)

根据评论,您希望能够根据所选语言更新标签。为此,您需要使用ajax将所选语言发布到返回json并更新DOM的控制器方法。您的视图模型应为

public SelectList AvailableLanguages { get; set; }
public int SelectedLanguage { get; set; }

并在控制器中

public ActionResult YourMethod()
{
  var model = new yourModel();
  model.SelectedLanguage = // set this if you want a default
  var availableLanguages = // get you list of languages
  model.AvailableLanguages = new SelectList(availableLanguages, "ID", "LanguageText")
  return View(model);
}

查看

@Html.DropDownListFor(m => m.SelectedLanguage, Model.AvailableLanguages)

<script>
  var url = '@Url.Action("GetLanguageLabels", "yourControllerName")';
  $('#SelectedLanguage').change() {
    $.getJSON(url, { ID: $(this).val() }, function(response) {
      // Note you will need to give your labels an id attribute
      $('#Label1').text(response.Label1);
      $('#Label2').text(response.Label2);
    })
  });
</script>

根据所选语言获取标签的方法

public JsonResult GetLanguageLabels(int ID)
{
  // Build a object of label values based on the selected language ID
  var data = new
  {
    Label1 = someValue,
    Label2 = anotherValue,
    ....
  };
  return Json(data, JsonRequestBehavior.AllowGet);
}

旁注:您当前代码存在一些问题。 (1)你的模型只有字段,而不是属性(没有获取/设置)所以没有任何东西会被绑定回发。 (2)您不能将html控件绑定到复杂对象(仅限值类型,或者在<select multiple>的情况下,绑定值类型数组)。

答案 1 :(得分:1)

你会确保元素是一个表格,只是和onchange后的函数名称......

@onchange="submitdata();"

然后你会添加脚本。

function submitdata()
{
  $('form').submit();
}

更多&#34; MVC&#34;您可以使用模型从强类型视图开始。

@model My.Path.To.Model

您还可以使用...

将表单数据打包在剃须刀页面上
using (@Html.BeginForm("myMethod", "Home", FormMethod.Post)){
     //form and inputs here, ect
     <form method="POST" action="" >
         //properties bound to inputs to change your model, or html helpers like display for...
         <input type="Submit" name="Submit" value="Submit"/>
     </form>
}

然后,您将模型作为Controller操作中的参数传递,这将在表单提交时调用:

[HttpPost]
 public FileStreamResult myMethod(Model model)
 {
     string str = model.imapropertyonthemodel;

 }

如果您是MVC的新手,我建议从W3 schools开始,或者如果您有多重视觉,那里有一些很棒的教程。