Вы не должны вызывать setState
внутри метода render
, у вас может получиться бесконечный цикл. Вызов myFunc
должен быть где-то еще (в зависимости от вашей бизнес-логики). Когда функция завершается, она обновляет состояние и затем запускает повторную визуализацию, поэтому MyComponent
получит самое последнее значение.
ОБНОВЛЕНИЕ
Я не знаю, какие условия потребуют повторного вызова myFunc, но вы можете сделать:
state = {
myProp: null // or some other value that MyComponent can handle as a null state
}
componentDidMount () {
myFunc((p) => {
if(!_.isEqual(p, this.state.myProp)) // This is needed only if you get null back from the callback and you don't want to perform an unnecesary state update
this.setState({myProp: p})
}
}
render(){
const { myProp } = this.state
// You can also do if (!myProp) return null
return <MyComponent myProp={myProp}/>
}
Скрытые поля ввода не помогут?
<%= Html.Hidden(...) %>
Обновление (сериализирующий объект к base64):
var formatter = new BinaryFormatter();
var stream = new MemoryStream();
formatter.Serialize(stream, myObject); // myObject should be serializable.
string result = Convert.ToBase64String(stream.ToArray());
Когда Вы хотите выбрать его назад:
var formatter = new BinaryFormatter();
var stream = new MemoryStream(Convert.FromBase64String(hiddenFieldValue));
var myObject = (MyObjectType)formatter.Deserialize(stream);
Удостоверьтесь, что Вы проверяете данные, хранившие в поле при использовании их, поскольку клиент мог бы изменить их. ViewState
заботится об этом автоматически.
Примечание стороны: использование ASP.NET LosFormatter
вместо BinaryFormatter
сериализировать ViewState
поскольку это - более эффективная или основанная на ASCII сериализация. Вы могли бы хотеть рассмотреть это также.
Вы могли сохранить массив JavaScript на клиенте... и затем передать всю информацию, когда пользователь в конечном счете сохраняет.
Необходимо работать немного больше, но в конце это окупается.
Я в большой степени использую jQuery, чтобы сделать материал как этот, это легче, чем это кажется.
TempData["MyData"], обратите внимание, это только продлится одно распространение в прямом и обратном направлениях.
Если бы Вы просто хотите сохранить данные для того запроса и следующего запроса, я рекомендовал бы использовать Tempdata, еще я рекомендую использовать ответ Mehrdad.