2

これは私の最初の投稿です!:)

モデルの配列をコントローラー クラスからビュー ページに返す必要があります。データをテキスト ボックスに入れ、テキスト ボックスごとに動的 ID を生成して、JavaScript を介してデータをさらに使用したい (そのため、動的 ID を探しています)。

モデル

public partial class BhBuyerChart
{
    public string Date { get; set; }
    public string Quantity { get; set; }

    public BhBuyerChart(string n, string d)
    {
        Date = n;
        Quantity = d;
    }
}

コントローラ

public ActionResult test()
{
     BhBuyerChart[] model = new BhBuyerChart[7];

     DataTable dt = (DataTable)ExecuteDB(ERPTask.AG_GetAllShipmentRecord, CurrentUserId);
     List<BhBuyerChart> ItemList = null;
     ItemList = new List<BhBuyerChart>();
     int i = 0;
     foreach (DataRow dr in dt.Rows)
     {
         model[i] = new BhBuyerChart(dr["Shipmentdate"].ToString(), dr["ShipmentQuantity"].ToString());
         i++;
     };

     return View(model);
}

意見

1 回目の試行

<div>
    <% for (int i=0; i<2; i++) {%>
    <%: Html.TextBoxFor(m => m[i].Quantity, new { id = "Quantity"})%>    <%--value can assign from model but dnt know how to assing dynamic id --%>

    <input type="text" value="<%= i %>" id="text<%=i %>"/>                 <%--dynamic id can be assinged dnt knw how to assing model value here in textbox --%>
    <% } %>
</div>

2回目の試行

<div>
<% int i = 0; %>
<% foreach (ERP.Domain.Model.BhBuyerChart user in Model) {  %>
      <% i++; %>
      <input type="text"; id="textbox<% i %>" ; value="<% user.Quantity %>" />   
 <% } %>
 </div>

皆さんの関心と助けに本当に感謝しています。あなたの反応を楽しみにしています!

4

3 に答える 3

0

Steven Sanderson によって作成された という優れた拡張機能が必要ですBeginCollectionItem。モデルの各行について、各入力は検証などに再利用できる一意の GUID を継承します。

拡張機能を段階的に使用する方法の詳細については、Steven Sanderson のブログの記事を参照してください: Editing a variable length list, ASP.NET MVC 2-style

この記事は MVC2 用に作成されましたが、MVC3 でも機能します。MVC4 で動作するはずですが、まだテストしていません。

意見

<% foreach (var item in Model) {
    <% using(Html.BeginCollectionItem("bhBuyerItem")) { %>
        <%= Html.TextBoxFor(m => m.Quantity) %>
        <%= Html.TextBoxFor(m => m.Date) %>
    <% } %>
<% } %>

拡張方法

public static class HtmlPrefixScopeExtensions
{
    private const string idsToReuseKey = "__htmlPrefixScopeExtensions_IdsToReuse_";

    public static IDisposable BeginCollectionItem(this HtmlHelper html, string collectionName)
    {
        var idsToReuse = GetIdsToReuse(html.ViewContext.HttpContext, collectionName);
        string itemIndex = idsToReuse.Count > 0 ? idsToReuse.Dequeue() : Guid.NewGuid().ToString();

        // autocomplete="off" is needed to work around a very annoying Chrome behaviour whereby it reuses old values after the user clicks "Back", which causes the xyz.index and xyz[...] values to get out of sync.
        html.ViewContext.Writer.WriteLine(string.Format("<input type=\"hidden\" name=\"{0}.index\" autocomplete=\"off\" value=\"{1}\" />", collectionName, html.Encode(itemIndex)));

        return BeginHtmlFieldPrefixScope(html, string.Format("{0}[{1}]", collectionName, itemIndex));
    }

    public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
    {
        return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
    }

    private static Queue<string> GetIdsToReuse(HttpContextBase httpContext, string collectionName)
    {
        // We need to use the same sequence of IDs following a server-side validation failure,  
        // otherwise the framework won't render the validation error messages next to each item.
        string key = idsToReuseKey + collectionName;
        var queue = (Queue<string>)httpContext.Items[key];
        if (queue == null) {
            httpContext.Items[key] = queue = new Queue<string>();
            var previouslyUsedIds = httpContext.Request[collectionName + ".index"];
            if (!string.IsNullOrEmpty(previouslyUsedIds))
                foreach (string previouslyUsedId in previouslyUsedIds.Split(','))
                    queue.Enqueue(previouslyUsedId);
        }
        return queue;
    }

    private class HtmlFieldPrefixScope : IDisposable
    {
        private readonly TemplateInfo templateInfo;
        private readonly string previousHtmlFieldPrefix;

        public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
        {
            this.templateInfo = templateInfo;

            previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
            templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
        }

        public void Dispose()
        {
            templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
        }
    }
}
于 2012-08-30T15:46:23.930 に答える
0

何度か試した後、私はこれを作ることができたと思います

<%for (int i = 0; i <= 1; i++)%>
<%  {  %>
  <div style="width:100%; float:left">
     <%: Html.TextBoxFor(m => m[i].Date, new { id= i+500 })%>
     <%: Html.TextBoxFor(m => m[i].Quantity, new { id = i })%>

     <%: Html.TextBoxFor(m => m[i].Quantity) %>

   </div>         
<script type="text/javascript">
    var val = [[], []];
    for (k = 0; k <= 1; k++) {
        val[k][0] = document.getElementById(k+300).value;
        val[k][1] = parseInt(document.getElementById(k).value);

    }
</script>

これはモデル配列から動的データを取得し、各テキストボックスの動的IDを作成し、動的IDを使用してそれらを変数に割り当てます

于 2012-08-30T16:19:59.343 に答える
0

私はこれがあなたのためにそれをするべきだと思います。実際にやろうとしていることは、コントローラー内に新しいメソッドを構築して、更新された値でコントローラーに POST できるようにすることです。Quantityさらに、フィールドがバインドされないため、フィールドに異なる名前を付けたくありません。したがって、作成するそれぞれの名前は、HTML が生成されるときに and 属性で指定されQuantityますname id

私があなたの必要性を誤解している場合は、コメントしてください。

コントローラ

public ActionResult test()
{
     BhBuyerChart[] model = new BhBuyerChart[7];

     DataTable dt = (DataTable)ExecuteDB(ERPTask.AG_GetAllShipmentRecord, CurrentUserId);
     List<BhBuyerChart> ItemList = null;
     ItemList = new List<BhBuyerChart>();
     int i = 0;
     foreach (DataRow dr in dt.Rows)
     {
         model[i] = new BhBuyerChart(dr["Shipmentdate"].ToString(), dr["ShipmentQuantity"].ToString());
         i++;
     };

     return View(model);
}

[HttpPost]
public ActionResult test(ICollection<BhBuyerChart> charts)
{
    // This allows you to POST to the controller with the modified values

    // Note that based on what you're collecting client side the charts
    // will ONLY contain the Quantity value, but they will all have one.
    // If you need the date you can either show a text box for that or
    // even place the date inside a hidden field.
}

意見

<form method="post" action="/{controllername}/test">
...
<div>
    <% for (int i=0; i<2; i++) {%>
        <!-- This line will both bind the value and allow you to POST -->
        <!-- this form back to the controller with the new values -->

        <!-- NOTE: each control is actually going to be named the same -->
        <!-- but when it's posted will post in order to the collection -->
        <%: Html.TextBoxFor(m => m[i].Quantity) %>

        <!-- You may or may not want this here so that you can get the -->
        <!-- value of the date back to the server during a POST -->
        <%: Html.HiddenFor(m => m[i].Date) %>
    <% } %>
</div>
...
</form>

JavaScript

JavaScript でできることは、jQuery をQuantity使用して、このように名前が付けられたすべての要素のリストを取得し、その配列からそれらを使用することです。

// with this ([0].Quantity) being the template
// we'll use a simple wildcard selector to find
// all of them that end with Quantity.

var elems = $("[name$=Quantity]")

// now you have a list of the elements that you
// can use to populate the other array with -
// getting the value with a statement like...

var val = elems[0].val();
于 2012-08-30T11:01:09.767 に答える