0

データ変換を実行するために、html textarea 要素から読み取ろうとしています。

私のテキストエリアコード

<textarea rows="4" cols="50" class="txtArea@(i)">

このメソッドに実装しようとしています

  public ActionResult About()
    {
        Document document = new Document();

        try
        {
            PdfWriter.GetInstance(document, new FileStream(Server.MapPath("~/") + "downloads/" + "print.pdf", FileMode.Create));
            document.Open();

            List<ielement> htmlarraylist = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(
                              new StringReader(txtArea.Text), null);

            for (int k = 0; k < htmlarraylist.Count; k++)
            {
                document.Add((IElement)htmlarraylist[k]);

            }

            Paragraph mypara = new Paragraph();
            document.Add(mypara);

            document.Close();

            Response.Redirect("~/downloads/print.pdf");
        }
        catch (Exception ex)
        {
            txtArea.Text = ex.Message;
            return View();
        }

    }
}

txtArea.Textしかし、どのように実装するのかという各インスタンスでエラーが発生しますか?

エラー: textArea は現在のコンテキストに存在しません

コードを表示

   ` @{
    ViewBag.Title = "About";
    int i = 1;
}

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
    <h2>@ViewBag.Message</h2>
</hgroup>
<table style="background-color: lightgreen; border: solid 2px black;">
    <tr>
        <td>
            <b>Name</b>
        </td>
        <td>
            <b>Size</b>
        </td>
        <td>
            <b>Preview</b>
        </td>
        <td>
            <b>Read File</b>
        </td>
         <td>
            <b>Convert File</b>
        </td>
    </tr>
    @foreach (var file in Model)
    {    
        <tr>
            <td>
                @file.Name
            </td>
            <td>
                @(file.Size / 1000) KB
            </td>
            <td>
                @(file.extension)
            </td>
            <td>
                <input id="btnreadfile@(i)" name="@file.Name" class='btnClick' type="button" value="Read File"/>
                <textarea  rows="4" cols="50" class="txtArea@(i)" name ="txtArea">@(ViewBag.DataVal)
</textarea>
            </td>
            <td>
                <input id="btnconvertfile@(i)" name="@file.Name" class='btnClick' type="button" value="Convert File"/>

            </td>
        </tr>   
        i++;
    }
</table>

<textarea></textarea>
<aside>
    <h3>Aside Title</h3>
    <p>
        Use this area to provide additional information.
    </p>
    <ul>
        <li>@Html.ActionLink("Home", "Index", "Home")</li>
        <li>@Html.ActionLink("About", "About", "Home")</li>
        <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
    </ul>
</aside>

<script>
    $(".btnClick").click(function () {
        var selectedId = $(this).attr("id").replace("btnreadfile", "");
        $.ajax({
            url: "/Home/ReadTextFile",
            type: "GET",
            data: { fileName: $(this).attr("name") },
            DataType: "text",
            success: function (str) {
                $(".txtArea" + selectedId).val(str);
            },
            error: function (err) {
                alert(err);
            }
        });
    });
</script>`

ここに画像の説明を入力

私が達成しようとしているのは、変換ボタンをクリックして、テキストエリア内のテキストをpdfファイルに変換することです。

4

2 に答える 2

0

「textArea」変数がどこにも定義されていないため、コードは機能しません。

MVC は ASPX と同じようには機能しません。すべてのフォーム コントロールには名前が必要です。これらの名前は、ビューが使用しているモデル オブジェクトのプロパティ名に対応している必要があります (コントローラーはモデル オブジェクトをパラメーターとして受け入れる必要があります)。コントローラーメソッドのパラメーター名に。コードにはいくつかの作業が必要です。

まず、テキストエリアの値を保持するプロパティを持つモデル クラスを定義します。

namespace YourProject.Models
{
    class AboutModel
    {
        public string MyText { get; set; }
    }
}

ビューの上部で、モデルを使用します。

@model YourProject.Models.AboutModel

ビューで、テキストエリアの値を保持するモデルのプロパティに対応する名前をテキストエリアに付け、テキストエリアの値をそのプロパティの値に初期化します。

<textarea rows="4" cols="50" name="MyText">@Model.MyText</textarea>

モデルを受け入れることができるパラメーターをコントローラーメソッドに与えます。

public ActionResult About(AboutModel model)

コントローラー メソッドの本体では、次の 2 つのケースを処理する必要があります。

  1. モデルが null の場合は、ビューが初めて呼び出され、初期化する必要があることを意味します。
  2. モデルが null でない場合は、フォームがデータとともにコントローラーにポストされたことを意味します。

このようなもの:

public ActionResult About(AboutModel model)
{
    if (model == null)
    {
        model = new AboutModel();
        model.MyText = "whatever you want the initial value of the text are to be";
        return View(model);
    }
    else
    {
        try
        {
            string textAreaValue = model.MyText;

            // do your processing on the textAreaValue here

            // if you want to redirect, do this:
            return Redirect("~/downloads/print.pdf");
        }
        catch (Exception ex)
        {
            model.MyText = ex.Message;
            return View(model);
        }
    }
}

ビューとコントローラーの間でやり取りする他の情報がある場合は、モデルにさらにプロパティを追加します。

お役に立てれば。これが意味をなさない場合は、MVC に関する適切なチュートリアルを見つけることをお勧めします。

于 2013-05-09T06:33:35.383 に答える
0

コントロールには runat="server" モードが必要なため、サーバー側でテキストエリアを取得できません。MVC を使用している場合は、HttpPost アクションでコントロールの名前を使用してサーバー側でコントロールを選択する必要があります。

テキストエリアに値を割り当てたい場合は、これを行うために ViewBag のプロパティが必要です。

これを行う:

<textarea rows="4" cols="50" class="txtArea@(i)" name="txtArea">@(ViewBag.DataVal)</textarea>

およびサーバー側コード:

[HttpPost]
public ActionResult About()
{
    Document document = new Document();

    try
    {
        PdfWriter.GetInstance(document, new FileStream(Server.MapPath("~/") + "downloads/" + "print.pdf", FileMode.Create));
        document.Open();

        List<ielement> htmlarraylist = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(
                          new StringReader(txtArea.Text), null);

        for (int k = 0; k < htmlarraylist.Count; k++)
        {
            document.Add((IElement)htmlarraylist[k]);

        }

        Paragraph mypara = new Paragraph();
        document.Add(mypara);

        document.Close();

        Response.Redirect("~/downloads/print.pdf");
    }
    catch (Exception ex)
    {
        ViewBag.DataVal = ex.Message;
        return View();
    }

}
于 2013-05-09T06:37:02.573 に答える