#asp.net #asp.net-mvc
#asp.net #asp.net-mvc
Вопрос:
Я работаю над веб-приложением в MVC, которое, когда пользователь вводит число, преобразует его в римскую цифру. У меня есть метод преобразования и базовая страница просмотра. Я борюсь с получением введенных данных в методе результата действия httppost, а затем запускаю его с помощью метода преобразования.
вот мой контроллер до сих пор:
public class ConvertController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(FormCollection form)
{
}
public void OnConvertClicked(object sender, EventArgs e)
{
//Button clicked
try
{
int number = Convert.ToInt32(myTextBox.Text);//Convert to number
string romanNumber = ToRomanNumber(number);//Get roman number
}
catch (Exception ex)
{
//The user input was not a number...
myTextBox.Text = "Error";
}
}
public string ToRomanNumber(int num)
{
var listOfNum = new List<int>() { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
var listOfRoman = new List<string>() { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
var numToRoman = "";
for (int i = 0; i < listOfNum.Count; i )
{
while (num >= listOfNum[i])
{
numToRoman = listOfRoman[i];
num -= listOfNum[i];
}
}
return numToRoman;
}
}
Вот мое мнение
@{
ViewBag.Title = "Index";
}
<h2>Numeral Converter</h2>
<fieldset>
<legend>Convert numbers to roman numerals</legend>
@using (Ajax.BeginForm("Index", "ConvertController",
new AjaxOptions { UpdateTargetId = "ConversionDeatils" }))
{
<div id="divInterestDeatils"></div>
<ol>
<li>
@Html.Label("Enter Number to Convert")
@Html.TextBox("myTextBox.Text")
</li>
</ol>
<button>Convert</button>
}
</fieldset>
Комментарии:
1. вам нужно использовать
type='submit'
кнопку2. Спасибо, это сработает? location.href='» @Url.Action(«OnConvertClicked», «ConvertController») «‘»);» />
3. нет необходимости
onclick
, и вам нужно вызвать OnConvertClicked из метода [httppost]4. хорошо, так что мне это не нужно, тогда public ActionResult Index(FormCollection form) { }
5. я постараюсь написать один пример ответа
Ответ №1:
вам нужно создать ViewModel
public class MyViewModel {
public string myNumber{ get; set; }
}
Измените свое представление на что-то вроде этого
@model MyViewModel
@{
ViewBag.Title = "Index";
}
<h2>Numeral Converter</h2>
<fieldset>
<legend>Convert numbers to roman numerals</legend>
@using (Ajax.BeginForm("Index", "ConvertController",
new AjaxOptions { UpdateTargetId = "ConversionDeatils" }))
{
<div id="divInterestDeatils"></div>
<ol>
<li>
@Html.Label("Enter Number to Convert")
@Html.EditorFor(m => m.myNumber)
</li>
</ol>
<button id="Submit" type="Submit" value="Convert"></button>
}
</fieldset>
И ваш контроллер в
public class ConvertController : Controller
{
public ActionResult Index()
{
MyViewModel myv = new MyViewModel();
return View(myv);
}
[HttpPost]
public ActionResult Index(FormCollection form)
{
MyViewModel myv = new MyViewModel();
decimal number = Convert.ToDecimal(form["myNumber"].ToString());
myv.myNumber = ToRomanNumber(number);
return View(myv);
}
public string ToRomanNumber(decimal num)
{
var listOfNum = new List<int>() { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
var listOfRoman = new List<string>() { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
var numToRoman = 0;
for (int i = 0; i < listOfNum.Count; i )
{
while (num >= listOfNum[i])
{
numToRoman = listOfRoman[i];
num -= listOfNum[i];
}
}
return numToRoman;
}
}
Попробуйте это, и @model MyViewModel
здесь вы можете захотеть изменить в соответствии с положением вашей модели представления
Комментарии:
1. спасибо, в этой строке ошибка myv.myNumber = ToRomanNumber(number); (number) часть говорит, что невозможно преобразовать из decimal в int
2. попробуйте изменить
ToRomanNumber(int num)
наToRomanNumber(decimal num)
иvar numToRoman = "";
наvar numToRoman = 0;
3. или, если вы уверены, что будет введено только целое число, измените
decimal number = Convert.ToDecimal(form["myTextBox"].ToString());
наint number = Convert.ToInt32(form["myTextBox"].ToString());
4. ошибка с этой строкой десятичное число = Преобразовать. ToDecimal(форма [«MyTextBox»]. toString()); говорит, что ссылка на объект не установлена для экземпляра объекта
5. извините, я забыл изменить имя текстового поля, измените
myTextBox
на имя текстового поля ur,myNumber