在 DropDownFor 值更改时更改 EditorFor 的值

Waq*_*med 3 c# linq asp.net-mvc jquery asp.net-mvc-4

我正在尝试制作一个网上银行网站(用于学习 ASP.NET MVC)。我有一个类帐户

class Account
{
int account_id;
String account_number;
decimal balance;
}
Run Code Online (Sandbox Code Playgroud)

我有一个交易模型。

 public class MakeTransactionModel
    {
        [Required]
        public String AccountFrom { get; set; }
        [Required]
        public String AccountTo { get; set; }

        public Decimal OrignalBalance { get; set; }
        [Required]
        public Decimal Amount { get; set; }
        [Required]
        public String TransactionFor { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

然后在控制器中,我将帐户放在 ViewBag 中。

ViewBag.account_from = new SelectList(db.Accounts, "account_id", "account_number");
Run Code Online (Sandbox Code Playgroud)

在视图中,我创建了一个用于显示所有帐户的下拉列表

@Html.DropDownListFor(u => u.AccountFrom, (SelectList)ViewBag.account_from, htmlAttributes: new { @class = "form-control", @id = "AccountFrom", onchange=@"
                    @Model.OrignalBalance = 1000; // I tried this but did not work
                " })
Run Code Online (Sandbox Code Playgroud)

现在,我试图表现出平衡选择的帐户在EditorFor

@Html.EditorFor(model => model.OrignalBalance, new { htmlAttributes = new { @id="OrignalBalance", @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
Run Code Online (Sandbox Code Playgroud)

我在ViewBag 中拥有所有帐户,并且在下拉列表中显示该帐户编号(这些帐户中也有余额)。我试图在DropDownFor值更改时更改EditorFor 的值,但仍然无法做到这一点。我尝试使用 jquery 做到这一点,但我不知道我可以在其中使用LINQjquery 中

我的 jquery 代码是

 <script type="text/javascript">

        $(document).ready(function () {
            $(function () {
                $('#AccountFrom').change(function () {
                    var selectedValue = $('#AccountFrom').text();
                    $('#OrignalBalance').val(@{new BankEntities().Accounts.SingleOrDefault(acc => acc.account_number == $('#AccountFrom').text())});   // I am trying to do this
                });
            });
        }
    )
    </script>
Run Code Online (Sandbox Code Playgroud)

如果我找到一个好的解决方案来做到这一点会很好,这样我就可以在更改事件时更新 EditorFor。

谢谢你。

Shy*_*yju 5

您应该进行ajax调用并传递帐号并从服务器获取金额。

$(function()
{
    $('#AccountFrom').change(function() {
    var accountId= $('#AccountFrom').val();
    var url="@Url.Action("Balance","Account")";
       $.post(url+"?accountNumber="+accountId,function(response){
          if(response.Status==="success")
          {
            $("#OrignalBalance").val(response.Balance);
          }
          else
          {
             alert("Invalid Account");
          }
       });
    });
});
Run Code Online (Sandbox Code Playgroud)

假设您有一个操作方法来返回余额

[HttpPost]
public ActionResult Balance(string accountNumber)
{
   //Of course you want to authorize the call
   var db=new BankEntities();
   var a= db.Accounts.FirstOrDefault(x=> x.account_number ==accountNumber);
   if(a!=null)
   {
      return Json( new { Status="success", Balance=a.Balance });
   }
   else
   {
     return Json( new { Status="error"});
   }
}
Run Code Online (Sandbox Code Playgroud)

如果您不想使用操作方法和 ajax 方式,您可以做的是,创建一个包含您的帐号和余额的字典,并将其作为视图模型的一部分传递,并在您的剃刀视图中将其设置为js 对象,在 change 事件中,您可以查询 js 字典以获取值。

此外,我建议不要使用 ViewBag 在您的操作方法和您的视图之间传输数据以呈现下拉列表。您应该添加一个强类型属性来处理它。

因此,让我们为您的视图模型添加一些新属性。

public class MakeTransactionModel
{
   // Your other existing properties here

   public Dictionary<string,decimal> AccountBalances { set; get; }   

   // These 2 properties are for rendering the dropdown.
   public int FromAccountId { set; get; }
   public List<SelectListItem> FromAccounts { set; get; }  
}
Run Code Online (Sandbox Code Playgroud)

并在您的 GET 操作中,使用帐号和相应的余额值填充此属性。

public ActionResult Transfer()
{
  var vm = new MakeTransactionModel();
  vm.AccountBalances = new Dictionary<string, decimal>();
  // Hard coded for demo. You may read it from your db tables.
  vm.AccountBalances.Add("CHECKING0001", 3450.50M);
  vm.AccountBalances.Add("SAVINGS0001", 4450.50M);

   //load the data for accounts.pls change to get from db
   vm.FromAccounts = new List<SelectListItem>
   {
       new SelectListItem { Value="CHECKING0001", Text="Checking" },
       new SelectListItem { Value="SAVINGS0001", Text="Saving" }
   };

  // to do : Load other properties also
  return View(vm);
}
Run Code Online (Sandbox Code Playgroud)

在您的 razor 视图中,序列化此属性并设置为 js 对象。

@model MakeTransactionModel
@using(Html.BeginForm())
{
  @Html.DropDownListFor(s=>s.FromAccountId,Model.FromAccounts,"Select")

  @Html.EditorFor(model => model.OrignalBalance, 
     new { @id="OrignalBalance", @class = "form-control",
     disabled = "disabled", @readonly = "readonly" } )
  <input type="submit" />
}
@section Scripts
{
<script>   
var balanceDict = @Html.Raw(Newtonsoft.Json.JsonConvert
                               .SerializeObject(Model.AccountBalances));

$(function () {

    $('#FromAccountId').change(function() {
        var accountId= $('#AccountFrom').val();
        var v = balanceDict[accountId];
        $("#OrignalBalance").val(v);
    });   

});
</script>
}
Run Code Online (Sandbox Code Playgroud)